如何在 Web API 中支持空 RouteAttribute?
How Do I Support Empty RouteAttribute in Web API?
我有这个class:
[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)
{
//...
}
...然后我可以打电话
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 按预期工作 - returns 2.
1) 您必须为查询参数指定 [FromUri] 属性
2) 如果你使用像 SomeEnum 这样的可空参数?为其设置默认值
[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri] SomeEnum? param = null)
{
//...
}
我有这个class:
[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)
{
//...
}
...然后我可以打电话
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 按预期工作 - returns 2.
1) 您必须为查询参数指定 [FromUri] 属性
2) 如果你使用像 SomeEnum 这样的可空参数?为其设置默认值
[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri] SomeEnum? param = null)
{
//...
}