Asp.net Web Api 路由 和 異常處理

來源:互聯網
上載者:User

一、路由:

建立一個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 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.