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的例子,这让我认为我做错了什么。

如有任何帮助,我们将不胜感激。

ASP.Net MVC 4 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;
}
AttributeRouting应该是一个很好的解决方案。它可以通过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 

如果这有帮助,请告诉我。