【问题标题】:use both url parameter and query string同时使用 url 参数和查询字符串
【发布时间】:2018-03-04 18:14:10
【问题描述】:

我的 Products 控制器中有两个操作方法。这是我的 RouteConfig。

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{action}/{id}",
     defaults: new { id = RouteParameter.Optional }
);

这是两个动作及其工作网址。

[HttpGet]
//uri:http://localhost:49964/api/products/product?strKey=1
public IHttpActionResult Product(string strKey)

[HttpPost]
//uri:http://localhost:49964/api/products/product
public IHttpActionResult Product([FromBody] Product product)

但我也想使用下面的 url 获取。

http://localhost:49964/api/products/product/1

但是 web api 会响应,

The requested resource does not support http method 'GET'.

【问题讨论】:

  • strKey 更改为id,如果您想保留strKey,请执行相反的操作。路由模板需要与操作相匹配才能按预期工作
  • 但是 id 是占位符,对吧?比如控制器和动作。

标签: c# asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

strKey 更改为id,如果您想保留strKey,请执行相反的操作。

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{action}/{strKey}",
     defaults: new { strKey = RouteParameter.Optional }
);

路由模板需要与操作相匹配,映射才能按预期工作。

//GET api/products/product/1
//GET api/products/product?strKey=1
[HttpGet]    
public IHttpActionResult Product(string strKey)

然而,这意味着此路由中的所有操作都可以选择使用 strKey 作为占位符

【讨论】:

  • 谢谢。我认为路由模板中的 id 是占位符。
  • 它是路由模板中的占位符。它只是不像控制器、动作或区域那样保留
  • 我认为文档从未在任何地方强调过“保留”部分。我曾经认为它是一个保留的占位符。
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多