ASP.Net MVC 4 WebAPI自定义路由
本文关键字:自定义 路由 WebAPI Net MVC ASP | 更新日期: 2023-09-27 17:58:53
我的WebAPI项目中有一个名为News的控制器,我有两个名为Get的默认操作,用于处理以下URL:
/api/新闻<-这将返回新闻列表/api/News/123<-这将按id返回一个特定的新闻项目。
到目前为止,一切都很简单,显然默认路由可以处理这些场景。我接下来想有一个URL,看起来像这样:
/api/新闻/123/艺术家<-将返回与指定新闻项目相关的所有艺术家。
现在我对ASP.NetMVC和WebAPI相当陌生,所以这是我第一次不得不处理路由问题。我修改了我的默认路线,如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{id}/{action}",
defaults: new { controller = "News", action = "Get", id = UrlParameter.Optional }
因此,在这里,我将{action}移到了URL的末尾,并将Artists方法添加到了我的News控制器中。这仍然适用于前两个场景,但对于第三个场景返回404。
显然,路由不适用于/api/News/123/Artists,但我不知道为什么。
我似乎找不到任何人使用这样的WebAPI的例子,这让我认为我做错了什么。
如有任何帮助,我们将不胜感激。
问题是,您试图访问Web API,但映射ASP.NET MVC
这是您需要的映射:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{action}",
defaults: new {controller = "News", action = "Get", id = RouteParameter.Optional}
);
它应该在App_Start ' WebApiConfig
中完成(如果使用默认模板设置)
方法示例(在您的新闻API控制器中):
// GET api/values/5
public string Get(int id)
{
return "value " + id;
}
// GET api/values/5
[HttpGet]
public string Artist(int id)
{
return "artist " + id;
}
Nuget
安装,文档就在这里。
一些例子
public class SampleController : Controller
{
[GET("Sample")]
public ActionResult Index() { /* ... */ }
[POST("Sample")]
public ActionResult Create() { /* ... */ }
[PUT("Sample/{id}")]
public ActionResult Update(int id) { /* ... */ }
[DELETE("Sample/{id}")]
public string Destroy(int id) { /* ... */ }
[Route("Sample/Any-Method-Will-Do")]
public string Wildman() { /* ... */ }
[GET("", ActionPrecedence = 1)]
[GET("Posts")]
[GET("Posts/Index")]
public ActionResult Index() { /* ... */ }
[GET("Demographics/{state=MT}/{city=Missoula}")]
public ActionResult Index(string state, string city) { /* ... */ }
}
它在custom routing
上运行得很好。
更新
在asp.net WebApi 2中,AttributeRouting包含在本机中。它有一些历史,第一个版本asp.net WebApi 1
在路由注释方面很弱。
然后,asp.net WebApi 2
被释放,AttributeRouting
被原生包含。所以,这个开放项目不再被维护了,GitHub页面上说。
在微软博客中,Independent Developer Profile – Tim McCall – Attribute Routing in MVC and Web API 2
部分也谈到了这段历史。
In routing Action是要路由到的方法上的操作名称。该操作名称应该在方法上使用的属性中。
[HttpGet]
[ActionName("CustomAction")]
public HttpResponseMessage MyNewsFeed(Some params)
{ return Request.CreateResponse(); }
现在你的路线应该像这个
routes.MapRoute(
name: "Default",
url: "{controller}/{id}/{action}",
defaults: new { controller = "News", action = "CustomAction", id = UrlParameter.Optional
如果这有帮助,请告诉我。