Asp.net Web Api 路由 和 异常处理

一、路由:

新建一个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 

原文地址:https://www.cnblogs.com/zhangpengshou/p/2593053.html