如何在Web API中支持空RouteAttribute?

Col*_*lin 5 c# asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我有这门课:

[RoutePrefix("api/v2/Foo")]
public class SomeController : BaseController
{
    [Route("")]
    [HttpGet]
    public async Task<HttpResponseMessage> Get(SomeEnum? param)
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过以下方式调用它: api/v2/Foo?param=Bar 但它不起作用.

如果我因此更改路由属性以在RouteAttribute中包含某些内容:

    [Route("SomeRoute")]
    [HttpGet]
    public async Task<HttpResponseMessage> Get(SomeEnum? param)
    {
        //...
    }
Run Code Online (Sandbox Code Playgroud)

...然后我可以打电话 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
       );
    }
Run Code Online (Sandbox Code Playgroud)

sta*_*tem 8

任何特殊条件?也许隐藏在BaseController中的东西?RouteConfig中的任何自定义配置?

您给出的示例适用于我,快速测试:

二手代码:

[RoutePrefix("api/v2/Foo")]
public class SomeController : ApiController
{
    [Route("")]
    [HttpGet]
    public Task<int> Get(int param)
    {
        return Task.FromResult(2);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用 http:// localhost:1910/api/v2/Foo?param = 1按预期工作 - 返回2.