一、路由:
建立一個ASP.NET MVC4 Web Application項目之後,我們會發現在網站根目錄下有個App_Start檔案夾。找到下面的RouteConfig.cs檔案,如下:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//①預設只有一個參數ID
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional}
);
//②這個是後來自己加的,用來添加兩個參數(ID和Name)的訪問:
routes.MapHttpRoute(
name: "AnotherApi",
routeTemplate: "api2/{controller}/{action}/{id}/{name}",
defaults: new { id = RouteParameter.Optional, name = RouteParameter.Optional }
);
routes.MapRoute(
name: "DevList",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Data", action = "List", id = UrlParameter.Optional }
);
}
}
Web API Controller
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// GET api/values/5/6
public string Get(int id,int name)
{
return "value";
}
// POST api/values
public void Post(string value)
{
}
// PUT api/values/5
public void Put(int id, string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
這裡有兩個路由規則,一個是針對API請求的路由規則,另一個是針對普通MVC頁面請求的路由規則,WebAPI請求路徑以字串”api”或"api2"開頭訪問webAPI的函數,加上“{action}”之後訪問中必須加入函數名稱。
如下:
沒有{action }情況routeTemplate: "api/{controller}/{id}":
http://localhost:3048/api/values
http://localhost:3048/api2/values/1/2
有{action }情況routeTemplate: "api/{controller}/{action}/{id}":
http://localhost:3048/api/get/values
http://localhost:3048/api2/get/values/1/2
Controllers中的函數,預設必須以get、post、put、delete開頭,否則無法訪問。那有無辦法可以不以get/post/put/delete開頭了呢?方法有二:
其一:在對應對應的Action之前加上[HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]屬性標籤,如下:
[HttpGet]
public string Get(int id)
{
return "value";
}
其二:亦可以使用如下這樣的方法特性來區分,[AcceptVerbs("GET")],[AcceptVerbs("GET", "HEAD")],另外如果你在Controller中寫了一個函數必須是public的,必須以Get開頭,而又不想讓用戶端以請求到此Action,那麼可以使用方法特性,[NonAction]來標記此方法;
二、異常處理:
當一個web api拋出一個異常後,此異常會被轉化成一個HTTP響應,我們不僅可以使用預設的HttpResponseMessage,而且可以進行自訂:
預設:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
return item;
}
自訂:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.ExpectationFailed) {
Content = new StringContent("DataBase Connection Faield"),
ReasonPhrase = "DataBase Connection Faield "
});
}
return item;
}
參考連結:
http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html
http://www.cnblogs.com/liulun/archive/2012/07/09/2582733.html