以Web Host的方式來寄宿Web API

FrankYou發表於2015-07-28

一、新建一個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>

  

相關文章