我有这个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中做什么,你应该能够在属性路由中做到这一点,不是吗?像可选参数,约束,......
答案 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
的方式是正确的,您无需更改它。