C# 如何在Web API中支持空RouteAttribute?

C# 如何在Web API中支持空RouteAttribute?,c#,asp.net,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-routing,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) { //... } } …然后我可以打电话 api/v2/Foo/SomeRoute?param=Ba

我有这门课:

[RoutePrefix("api/v2/Foo")]
public class SomeController : BaseController
{
    [Route("")]
    [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);
    }
}
[RoutePrefix(“api/v2/Foo”)]
公共类控制器:ApiController
{
[路线(“”)
[HttpGet]
公共任务获取(int参数)
{
返回任务.FromResult(2);
}
}
召唤 按预期工作-返回2。

1)您必须为查询参数指定[FromUri]属性

2) 如果使用像SomeEnum这样的可空参数?设置它的默认值

[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri] SomeEnum? param = null)
{
    //...
}
[路线(“”)]
[HttpGet]
公共异步任务Get([FromUri]SomeEnum?param=null)
{
//...
}

您只需在Get方法上使用[Route(“api/v2/Foo”)],您尝试过吗?这能用“api/v2/Foo/Bar”吗?@RicardoPontual-我尝试过,但没有成功:-(@Prashant-不。路由是为其他事情保留的(我很好奇这个特定情况的答案,而不是解决办法),谢谢你的确认。事实证明,有人在应用程序启动时对路由映射所做的事情把事情搞砸了。
[Route("")]
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri] SomeEnum? param = null)
{
    //...
}