• 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 

  • 相关阅读:
    20190912
    20190825
    20190818
    20190811
    20190804
    数据结构与算法之顺序表
    数据结构与算法之顺序表
    数据结构与算法之单链表
    数据结构与算法之循环双链表
    数据结构与算法之循环单链表
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/2593053.html
Copyright © 2020-2023  润新知