一、路由:

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

}