7

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

/api/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 }

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

显然路由不适用于 /api/News/123/Artists 但我不知道为什么。

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

任何帮助,将不胜感激。

4

3 回答 3

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}
  );

并且应该在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;
}
于 2013-02-12T16:31:18.407 回答
3

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 页面中说。

在 microsoft blog中,该部分Independent Developer Profile – Tim McCall – Attribute Routing in MVC and Web API 2也谈到了历史。

于 2013-02-20T10:19:06.037 回答
1

在路由中,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 

让我知道这是否有帮助。

于 2013-02-12T16:22:27.307 回答