标签:
Web Api 是什么?
MSDN:ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务
百度百科:Web API是网络应用程序接口。
个人理解:Web API 是提供给多种客户端对data做CRUD(增删查改)操作的统一接口
-------------------------------------------
Asp.net Web API 支持多种寄宿方式
1,IIS作为宿主(创建一个Asp.net web应用程序作为Web API 的宿主)
2,自宿主(不需要IIS支持,使用任意的应用程序作为宿主【控制台、Windows Forms、WPF甚至Windows Service】)
看了Artech大神的一小节Web API,记录一下学到的东西
1,以Web Host方式寄宿Web API
Visual Studio 为我们提供了专门用于创建ASP.NET Web API应用的项目模板,我们可以一键式创建一个完整的APS.NET Web API项目。
这里先不使用Visual Studio自动创建的。我们完全在创建的空项目中编写我们的程序。
1.1 构建解决方案
1.2 定义Web API
在正式定义Web API 之前,我们需要在项目Model中定义一个代表联系人的实体类Contact,这里做简单的定义
public class Contact { public string ID { get; set; } public string Name { get; set; } public string PhoneNum { get;set; } }
Web API定义在API项目中,需要继承ApiController,ApiController定义在程序集“System.Web.Http.dll”, 程序集在“C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”可以找到
在ContactsController中,我们定义了Get、Post、Put、Delete这4个Action,它们分别实现了针对联系人的查询、添加、修改、删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自能处理的请求必须采用HTTP方法
public class ContactsController : ApiController { List<Contact> contacts; public ContactsController() { contacts = new List<Contact>(); contacts.Add(new Contact() { ID = "001", Name = "小白", PhoneNum = "13529093839" }); contacts.Add(new Contact() { ID = "002", Name = "大白", PhoneNum = "13529093838" }); contacts.Add(new Contact() { ID = "003", Name = "小黑", PhoneNum = "13529088838" }); } public IEnumerable<Contact> Get(string id=null) { return from c in contacts where c.ID==id||string.IsNullOrEmpty(id) select c; } public void Post(Contact item) { contacts.Add(item); } public void Put(Contact item) { contacts.Remove(contacts.First(c => c.ID == item.ID)); contacts.Add(item); } public void Delete(string id) { contacts.Remove(contacts.First(c => c.ID == id)); } }
1.3 将WebHost作为Web API的宿主
WebHost在解决方案中是一个空的ASP.NET Web应用程序,我们还需要为其添加一些必需的程序集引用。
我们需要在WebHost项目中添加一个Global.asax全局配置文件,注册一个默认路由,路由系统会解析当前请求访问的目标HttpController和Action的名称
protected void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
路由规则中没有表示目标Action的路由参数,ASP.NET Web API如何根据请求确定哪个Action方法应该被调用呢?其实它能根据请求采用HTTP方法来确定目标Action方法。当然在注册路由模板中提供代表Action名称的路由参数({action})也是支持的。
现在Web API的以WebHost为宿主的工作就完成了,我们可以利用浏览器来调用寄宿的Web API来判断寄宿工作是否成功。由于浏览器在默认情况下访问我们在地址栏中输入的地址总是采用HTTP-GET请求,所以我们只能利用它来调用支持HTTP-GET的Action方法,即定义在ContactsController中的Get方法。
采用Chrome浏览器可以看到我们获取的联系人列表是XML格式的数据表示,对于ASP.NET Web API 来说,它会优先利用请求报头"Accept"携带的媒体类型来确定相应内容应用的表现形式。
如下所示是Chrome访问“http://localhost:3697/api/contacts/001”发送请求的内容,它之所以会得到以XML表示的响应是因为“Accept”报头指定的媒体类型列表中只有“application/xml”被ASP.NET Web API支持。如果我们使用IE,请求的“Accept”报头将携带不同的媒体类型列表,我们实际上会得到以JSON格式表示的响应结果
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Cache-Control:max-age=0 Host:localhost:3697 Proxy-Connection:keep-alive User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
我们利用Fiddler来发送调用Web API的HTTP请求,获取以JSON格式表示的响应结果。
如图,利用Fiddler发送了一个针对目标地址"http://localhost:3697/api/contacts/001"的Http-GET请求,并添加了一个值为"application/json"的“Accept”报头,Execute发送请求之后确实得到了Json格式表示的联系人列表
使IIS支持Put和Delete请求
在定义ContactsController的时候,我们分别采用Get、Post、Put、Delete作为获取、创建、修改和删除联系人的操作所支持的HTTP方法。但是IIS默认是不支持Put和Delete请求的
IIS拒绝PUT和DELETE请求是由默认注册的一个名为"WebDAVModule"的自定义HttpModule导致的。解决这个问题最为直接的方式就是将注册的HttpModule移除
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> </system.webServer>
2,自宿主的方式寄宿Web API
我们在原来的解决方案中添加一个空的控制台应用程序SelfHost作为宿主
跟WebHost一样,引用解决方案中的API.dll,同样需要应用一些必需的程序集(红色为与WebHost不同的)
通过前面的WebHost,我们知道接下来需要做的是注册路由了。在此之前我们还需要动态加载解决方案中的程序集API.dll,
下面是Artech大神在 【在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 】中写的, 有个错误的地方httpServer.OpenAsync()后没有执行Wait()方法,导致计算机并未分配一个端口给程序,这让我折腾了好久,不过也学到了其他知识,比如:[如何查看计算机某个端口被谁占用]
static void Main(string[] args) { Assembly.Load("API,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"); HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://127.0.0.1:7304"); using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration)) { httpServer.Configuration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); httpServer.OpenAsync();//纠正:httpServer.OpenAsync().Wait(); Console.Read(); } }
当我们没有执行Wait()方法时,查看一下计算机是否有分配端口
1,首先调出命令窗口:开始---->运行---->cmd,或者是window+R组合键
2,输入命令:netstat -ano,可以看到所有端口的情况。发现找了几百遍也是找不到7304端口的
如果你加了Wait(),运行后出现
“HTTP 无法注册 URL http://+:****/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)”
你只要以管理员的身份打开Visual Studio就可以了
【ASP.NET Web API2框架揭秘】 初识Web API
标签:
原文地址:http://www.cnblogs.com/Sunlimi/p/4373995.html