C# 带有可选参数和查询参数的Web Api属性路由

C# 带有可选参数和查询参数的Web Api属性路由,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我有一个web api控制器: [RoutePrefix("api/product")] public class ProductController : ApiController { [HttpGet, Route("{id?}")] public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Gu

我有一个web api控制器:

[RoutePrefix("api/product")]
public class ProductController : ApiController
{
    [HttpGet, Route("{id?}")]
    public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Guid? id = null)
    {
        ...     
    }
}
我应该声明默认路由吗?
在我看来,因为我使用属性映射,所以我不需要这样做

我试图这样改变我的路线:

[RoutePrefix("api")]
public class ProductController : ApiController
{

    [HttpGet, Route("product/get/{id?}")]
    public async Task<HttpResponseMessage> GetProduct([FromUri] Guid param1, [FromUri] string param2, Guid? id = null)
    {
      ...
    }
}
[RoutePrefix(“api”)]
公共类ProductController:ApicController
{
[HttpGet,Route(“product/get/{id?}”)]
公共异步任务GetProduct([FromUri]Guid参数1,[FromUri]string参数2,Guid?id=null)
{
...
}
}
此uri api/product/get/?param1=something¶m2=smt仍然不起作用。
(我尝试了api/product/?param1=something¶m2=smt和相关的路由,但不起作用)

我需要在我的WebApiConfig.cs中声明默认路由吗?

您可以在WebApiConfig.cs中执行的操作,应该可以在属性路由中执行,不是吗?与可选参数、约束等类似,

您的路由前缀太具体。我相信你想要:

[RoutePrefix("api")]
public class ProductController : ApiController
{
    [HttpGet, Route("product/{id?}")]
    public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Guid? id = null)
    {
        ...     
    }
}
[RoutePrefix(“api”)]
公共类ProductController:ApicController
{
[HttpGet,Route(“产品/{id?}”)]
公共异步任务GetProduct([FromUri]字符串参数1=null,[FromUri]字符串参数2=null,Guid?id=null)
{
...     
}
}

这对你来说应该很好。路由前缀本身不是路由,因此默认路由应该不那么具体。

我无法重构此错误,但我想推荐一种更好的模式供您遵循

您有一种方法过于笼统,需要在实际工作之前对参数进行主要检查

如果有两个独立的端点,那就更好了。 一般的
Get
方法如下:

Get([FromUri]string关键字=null)

另一个例子是:

GetById(Guid id)


您设置
RoutePrefix
的方式是正确的,无需更改。

您的WebApiConfig.cs文件中是否配置了任何路由?因此,请提供路线配置。谢谢
[RoutePrefix("api")]
public class ProductController : ApiController
{
    [HttpGet, Route("product/{id?}")]
    public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Guid? id = null)
    {
        ...     
    }
}