【问题标题】:How to specify route with query-string?如何使用查询字符串指定路由?
【发布时间】:2013-06-07 14:14:41
【问题描述】:

我正在尝试将 AttributeRouting 添加到我的 WebAPI 项目中。

在一个控制器上,我目前定义了三个 GET 方法:

[GET("dictionaries")]
public IEnumerable<Dictionary> Get()

[GET("dictionaries/{id}")]
public Dictionary GetByID(int id)

[GET("dictionaries/{dictionaryID}/{page}")]
public Dictionary Browse(long dictionaryID, int page)

前两条路由按我的预期工作,但第三条总是返回 405 METHOD NOT ALLOWED

我已尝试发送 URL 中的参数和查询字符串,两者的响应相同。当我尝试查询字符串版本时,我已将路线修改为

[GET("dictionaries?dictionaryID={dictionaryID}&page={page}

我还尝试将初始单词从 dictionaries 更改为 dictionary 以避免与其他两个 GET 路由产生任何歧义,但仍然没有成功。

documentation for AttributeRouting 仅提及与参数约束相关的查询字符串(由于 WebHost 框架,我无法使用这些查询字符串),并没有提及如何在路由中使用查询字符串。

谁能告诉我如何使用这两个参数实现第三条路线,还是我必须放弃 AttributeRouting 或尝试使用它自己的控制器?

【问题讨论】:

    标签: c# asp.net-web-api query-string asp.net-web-api-routing attributerouting


    【解决方案1】:

    Web API 动作选择器隐含地认为这里的第三个动作是 POST,因为它不以 GET、POST、PUT 等动词开头。尝试添加 HttpGet 属性,看看这是否有效。

    [HttpGet, GET("dictionaries/{dictionaryID}/{page}")]  
    public Dictionary Browse(long dictionaryID, int page)
    

    【讨论】:

    • 感谢 Kiran,现在可以完美运行了。我认为 AttributeRouting 的 GET 属性允许我删除 WebAPI 的 HttpGet 属性——GET 取代了 HttpGet——但显然这不是真的。
    • 这是 AR 的一个已知问题。 IActionHttpMethodProvider 在 Web API RTM 中是内部的,这会导致此处出现问题。在 Web API vNext 中,它已更改为 public,因此一旦发布,您将不再需要此双重声明。更多信息在这里github.com/mccalltd/AttributeRouting/issues/83
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多