我有两条路线作为我的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
这可以像我预期的那样工作。您可以单独呼叫每条路线。
但是我的原始解决方案仍设法调用两条路线,任何人都可以建议我可能会改变哪些内容会允许这样做吗?
答案 0 :(得分:1)
想想,你已经创建了api控制器并查看控制器路由注册。
因此,您需要按照以下步骤在项目中引用webapi。
但是由于重复,您的实现会出错。
找到了与请求匹配的多个操作:ThingsConfig类型FailTracker.Controllers.ThingsController ThingsData类型FailTracker.Controllers.ThingsController
答案 1 :(得分:0)
事实证明问题出在客户端 - 它实际上是在调用两条路由。使用Fiddler测试原始API没有显示问题。
在“键盘和椅子之间的问题”下将此文件归档。