ASP.Net MVC 4 WebAPI自定义路由

Lee*_*ale 7 c# asp.net asp.net-mvc-4 asp.net-web-api

我的WebAPI项目中有一个名为News的控制器,我有两个名为Get的默认操作,它处理以下URL:

/ api/News < - 这将返回news/api/News/123 < - 这将返回id的特定新闻项目列表.

到目前为止一切都很简单,显然默认路由处理这些场景.我接下来想要一个看起来像这样的URL:

/ api/News/123/Artists < - 将返回与指定新闻项目相关的所有艺术家.

现在我对ASP.Net MVC和WebAPI都是相当新闻,所以这是我第一次不得不处理路由.我修改了我的默认路由,如下所示:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{id}/{action}",
            defaults: new { controller = "News", action = "Get", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

所以我在这里将{action}移到了URL的末尾,并在我的News控制器中添加了Artists方法.这仍然适用于前两个场景,但为第三个场景返回404.

显然路由不适用于/ api/News/123/Artists,但我不明白为什么.

我似乎无法找到任何像这样使用WebAPI的人的例子,这让我觉得我做的事情从根本上是错误的.

任何帮助,将不胜感激.

Rad*_*ler 8

问题是,您正在尝试访问Web API但映射ASP.NET MVC

这是您需要的映射:

config.Routes.MapHttpRoute(
  name: "DefaultApi",
  routeTemplate: "api/{controller}/{id}/{action}",
  defaults: new {controller = "News", action = "Get", id = RouteParameter.Optional}
  );
Run Code Online (Sandbox Code Playgroud)

它应该在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;
}
Run Code Online (Sandbox Code Playgroud)