如何在Web API中支持空RouteAttribute ?
本文关键字:支持 RouteAttribute API Web | 更新日期: 2023-09-27 18:04:52
我有这样一个类:
[RoutePrefix("api/v2/Foo")]
public class SomeController : BaseController
{
[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get(SomeEnum? param)
{
//...
}
}
我想通过:api/v2/Foo?param=Bar
但是它不工作。
如果我改变路由属性,从而在RouteAttribute中包含一些东西:
[Route("SomeRoute")]
[HttpGet]
public async Task<HttpResponseMessage> Get(SomeEnum? param)
{
//...
}
…那么I 可以调用api/v2/Foo/SomeRoute?param=Bar
,但那不是我想要的。
我如何使第一种情况起作用?
编辑:Domas Masiulis把我引向了答案:上面的场景确实有效,只是默认的全局路由把事情搞砸了。我通过添加一个单独的默认路由来解决这个问题,该路由与我们的约定相匹配…
public static void RegisterRoutes(RouteCollection routes)
{
//ADDING THIS FIXED MY ISSUE
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/v2/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//SOURCE OF THE ORIGINAL PROBLEM
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Administration", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
有什么特殊条件吗?也许在BaseController中隐藏了什么?RouteConfig中有任何自定义配置吗?
你给的例子为我工作,做了一个快速测试:
使用代码:[RoutePrefix("api/v2/Foo")]
public class SomeController : ApiController
{
[Route("")]
[HttpGet]
public Task<int> Get(int param)
{
return Task.FromResult(2);
}
}
调用http://localhost:1910/api/v2/Foo?param=1正常工作-返回2.
1)您必须为查询参数指定[FromUri]属性
2)如果您使用可空参数,如SomeEnum?为它设置一个默认值
[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri] SomeEnum? param = null)
{
//...
}