Web Api属性路由,带有可选参数和查询参数

时间:2017-02-23 16:00:28

标签: 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, Guid? id = null)
    {
        ...     
    }
}

我想访问那些uri:
API /产品/参数1 =东西&安培; param2的SMT =

API /产品/ 7b55fcee-21e7-4b10-80e3-42b4d9cf913d参数1 =东西&安培; param2的SMT =

但是,第一个uri不起作用,未设置route参数的默认值 这个uri有效:
API /产品/空参数1 =东西&安培; param2的SMT =
不是这一个:
API /产品/参数1 =东西&安培; param2的SMT =

我尝试使用&#34;字符串&#34;对于路线参数,但它仍然无法正常工作。

是参数的顺序吗?
或者我误解了Web Api路线映射的某些内容?

编辑: 我的WebApiConfig.cs不包含默认路由:

public static class EdmWebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
       if (config == null) throw new ArgumentNullException(nameof(config));

       // Attribute routing
       config.MapHttpAttributeRoutes();

       ...
       some declaration of formatters
       ...
    }
}

我应该声明默认路线吗? 在我看来,由于我使用属性映射,我不需要这样做。

我试图改变我的路线:

[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)
    {
      ...
    }
}

这个uri api / product / get /?param1 = something&amp; param2 = smt 仍然不起作用。
(我尝试了 api / product /?param1 = something&amp; param2 = smt 以及相关的路由,但没有工作)

我是否需要在WebApiConfig.cs中声明默认路由?
你可以在WebApiConfig.cs中做什么,你应该能够在属性路由中做到这一点,不是吗?像可选参数,约束,......

2 个答案:

答案 0 :(得分:1)

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

[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)
    {
        ...     
    }
}

哪个应该适合你。路径前缀本身不是路由,因此默认路由应该不那么具体。

答案 1 :(得分:0)

我无法重建此错误,但我想为您推荐更好的模式。

你有一个过于笼统的方法,在完成实际工作之前需要对参数进行重大检查。

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

Get([FromUri] string keyword = null)

另一个如:

GetById(Guid id)

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