首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向ASP.NET Web API控制器添加显式操作路由

向ASP.NET Web API控制器添加显式操作路由
EN

Stack Overflow用户
提问于 2014-01-16 10:10:00
回答 2查看 25.2K关注 0票数 18

我有一个带有ApiController的ASP.NET Web API项目,它提供了一个具有以下操作的User端点:

代码语言:javascript
复制
GET /api/User
POST /api/User
DELETE /api/user

我想提供以下端点:

代码语言:javascript
复制
GET /api/user/metrics

但是,当我像这样定义控制器操作时:

代码语言:javascript
复制
[HttpGet]
public HttpResponseMessage Metrics()
{
    return null;
}

我收到Multiple actions were found that match the request错误消息。

我知道这违反了“纯”REST API的定义,但我想这样做。我想我必须通过映射一个HTTP路由来解决这个问题,但是我已经尝试了几个路由,但是我不能让它工作。我的路线应该是什么样子的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-16 13:03:23

默认路由不包括该操作。

代码语言:javascript
复制
routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

它根据控制器、HTTP谓词和路由中的参数或缺少参数来选择操作。因此,它正在寻找正确的控制器,并寻找一个不带参数的GET操作。它会找到两个。

您应该添加一个包含该操作的附加路由。这可以通过Kiran提到的基于属性的路由或基于约定的路由来完成。对于基于约定的路由,路由通常放在WebApiConfig.csApplication_start()方法中。更具体的路由放在一般路由之前,因此您的路由将如下所示:

代码语言:javascript
复制
config.Routes.MapHttpRoute(
                name: "ApiWithAction",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
票数 19
EN

Stack Overflow用户

发布于 2014-01-16 10:39:58

如果您使用的是Web API 2,我建议您使用属性路由,这将使此类场景的体验变得更容易。

您可以在大多数场景中继续使用默认的常规路由,但可以在需要的地方使用属性路由,如在当前场景中。

下面的示例演示了一个类似的场景:

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAttributeRoutingSample/WebApiAttributeRoutingSample/Controllers/Api/CustomersController.cs

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21152168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档