以Web Host的方式来寄宿Web API
一、新建一个Common的类库项目并新建一个测试用的Contact实体类
1 namespace Common 2 { 3 public class Contact 4 { 5 public string Id { get; set; } 6 public string Name { get; set; } 7 public string PhoneNum { get; set; } 8 public string EmailAddress { get; set; } 9 public string Address { get; set; } 10 } 11 }
二、新建一个WebApi的类库项目并新建一个测试用的ContactsController类
表现为HttpController 的Web AP1定义在WebApi项目之中,我们一般将ApiController作为继承的基类。ApiControIIcr定义在
“system.Web Httpd1” 程序集中,我们可以在目录“%ProgramFiles%Microsoft ASP.NET\ASP.NET Web Stack 5\Packages” 中找到这个程序集。
具体来说,该程序集存在于子目录“Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45” 中。
Web API体现在如下所示的ContactsController类型中。在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自所能处理的请求必须采用的HTTP方法。
1 using System.Collections.Generic; 2 using System.Linq; 3 using System.Web.Http; 4 using Common; 5 6 namespace WebApi 7 { 8 public class ContactsController : ApiController 9 { 10 private static readonly List<Contact> Contacts; 11 12 static ContactsController() 13 { 14 Contacts = new List<Contact> 15 { 16 new Contact 17 { 18 Id = "001", 19 Name = "张三", 20 PhoneNum = "12345678", 21 EmailAddress = "zhangsan@gmail.com", 22 Address = "add1" 23 }, 24 new Contact 25 { 26 Id = "002", 27 Name = "李四", 28 PhoneNum = "23456789", 29 EmailAddress = "lisi@gmail.com", 30 Address = "add2" 31 } 32 }; 33 } 34 35 public IEnumerable<Contact> Get(string id = null) 36 { 37 return from contact in Contacts where contact.Id == id || string.IsNullOrWhiteSpace(id) select contact; 38 } 39 40 public void Post(Contact contact) 41 { 42 Contacts.Add(contact); 43 } 44 45 public void Put(Contact contact) 46 { 47 Contacts.Remove(Contacts.First(c => c.Id == contact.Id)); 48 Contacts.Add(contact); 49 } 50 51 public void Delete(string id) 52 { 53 Contacts.Remove(Contacts.First(c => c.Id == id)); 54 } 55 } 56 }
三,新建一个ASP.NET Web项目并修改Global.asax.cs文件
除了在Application_Start中加入路由配置外,还需要在此项目中引用之前创建的WebApi项目
1 using System; 2 using System.Web; 3 using System.Web.Http; 4 using System.Web.Routing; 5 6 namespace WebHost 7 { 8 public class Global : HttpApplication 9 { 10 protected void Application_Start(object sender, EventArgs e) 11 { 12 RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}"); 13 14 // 全局路由表HttpRouteCollection对象的扩展方法MapHttpRoute来完成 15 GlobalConfiguration.Configuration.Routes.MapHttpRoute("defaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}); 16 } 17 } 18 }
四,测试
用Chrome默认一application/xml的Content-Type返回,IE则默认以application/json的Content-Type返回;
我这边用Chrome测试的返回结果:
请求URL:http://localhost/webhost/api/contacts
<ArrayOfContact xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Common"> <Contact> <Address>add1</Address> <EmailAddress>zhangsan@gmail.com</EmailAddress> <Id>001</Id> <Name>张三</Name> <PhoneNum>12345678</PhoneNum> </Contact> <Contact> <Address>add2</Address> <EmailAddress>lisi@gmail.com</EmailAddress> <Id>002</Id> <Name>李四</Name> <PhoneNum>23456789</PhoneNum> </Contact> </ArrayOfContact>
请求URL:http://localhost/webhost/api/contacts/001
<ArrayOfContact xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Common"> <Contact> <Address>add1</Address> <EmailAddress>zhangsan@gmail.com</EmailAddress> <Id>001</Id> <Name>张三</Name> <PhoneNum>12345678</PhoneNum> </Contact> </ArrayOfContact>