Asp.net Web Api 路由 和 异常处理
一、路由:
新建一个ASP.NET MVC4 Web Application项目之后,我们会发现在网站根目录下有个App_Start文件夹。找到下面的RouteConfig.cs文件,如下:
{
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
{
// 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]属性标签,如下:
public string Get(int id)
{
return "value";
}
其二:亦可以使用如下这样的方法特性来区分,[AcceptVerbs("GET")],[AcceptVerbs("GET", "HEAD")],另外如果你在Controller中写了一个函数必须是public的,必须以Get开头,而又不想让客户端以请求到此Action,那么可以使用方法特性,[NonAction]来标记此方法;
二、异常处理: 当一个web api抛出一个异常后,此异常会被转化成一个HTTP响应,我们不仅可以使用默认的HttpResponseMessage,而且可以进行自定义:
默认:
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
return item;
}
自定义:
{
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