WebAPI,多个路由被调用

时间:2017-03-24 09:05:15

标签: c# asp.net-web-api

我有两条路线作为我的webAPI的一部分,它们接受相同的参数但是对路线有不同的静态组件。然而他们在请求期间都被调用了。

[HttpGet]
[Route("things/{id}/config/{optional?}")]
public dynamic ThingsConfig(int id, int optional = 0)
{
    // stuff happens
}

[HttpGet]
[Route("things/{id}/data/{optional?}")]
public dynamic ThingsData(int id, int optional = 0)
{
    // stuff happens
}

我在Global.asax中的路由配置与开箱即用的版本

相同
routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { action = "get", id = RouteParameter.Optional }
   );

如果我注释掉[Route]行,则API会按预期返回404错误。然而,当访问一条路线时它们存在,那么它们都是例如:

http://localhost/api/things/1/config/

将调用ThingsConfig和ThingsData

我在这里做错了什么?

更新:

我试图简化问题。

创建新的VS 2015解决方案。 档案 - >新 - >项目

选中“检查.NET Framework 4.5” 在C#下选择“ASP.NET Web应用程序(.NET Framework)” - >网络

选择“网络API”

“将身份验证更改”为“无身份验证”(稍微简化一下)

对值控制器进行了以下更改:

将RoutePrefix添加到控制器本身 - 这似乎是必需的。 添加了我的两条测试路线 - 所以控制器的头部现在看起来像这样:

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
    [HttpGet]
    [Route("things/{id}/config/{optional?}")]
    public dynamic ThingsConfig(int id, int optional = 0)
    {
        return "Config";
    }

    [HttpGet]
    [Route("things/{id}/data/{optional?}")]
    public dynamic ThingsData(int id, int optional = 0)
    {
        return "Data";
    }

没有对默认框架工作进行其他更改。

然后调用两条路线:

http://localhost:<port>/api/values/things/1/config
http://localhost:<port>/api/values/things/1/data

这可以像我预期的那样工作。您可以单独呼叫每条路线。

但是我的原始解决方案仍设法调用两条路线,任何人都可以建议我可能会改变哪些内容会允许这样做吗?

2 个答案:

答案 0 :(得分:1)

想想,你已经创建了api控制器并查看控制器路由注册。

因此,您需要按照以下步骤在项目中引用webapi。

但是由于重复,您的实现会出错。

找到了与请求匹配的多个操作:ThingsConfig类型FailTracker.Controllers.ThingsController ThingsData类型FailTracker.Controllers.ThingsController

答案 1 :(得分:0)

事实证明问题出在客户端 - 它实际上是在调用两条路由。使用Fiddler测试原始API没有显示问题。

在“键盘和椅子之间的问题”下将此文件归档。