【问题标题】:Wep Api - 405 Method Not AllowedWeb Api - 405 方法不允许
【发布时间】:2017-04-14 22:33:10
【问题描述】:

我有一个带有控制器的 Web Api 项目,该控制器具有 GET、DELETE、POST 和 PUT 方法。

当我尝试对此控制器执行 POST 或 PUT 时,总是会收到 405 Method Not Allowed 错误。发送过来的数据看起来是有效的,它只是一个具有六个简单属性的对象。我在我的方法中放置了一个断点,在这种情况下,正如预期的那样,它没有被命中。我注册了一个 DelegatingHandler(在Web Api - Catch 405 Method Not Allowed 提到)来检查传入的请求和传出的响应,我可以看出我的请求正在由 Api 处理(这意味着问题不在于客户端)。我还使用 Fiddler 来检查请求/响应,并且响应标头在 Security、Allow: DELETE, GET 下显示。

这清楚地告诉我,无论出于何种原因,PUT 和 POST 都是不允许的,尽管据我所知,即使我有用 [HttpPost] 和 [HttpPut] 属性修饰的方法并且正确配置了路由。我使用的是默认路由,但也有使用属性路由的方法。

这听起来可能存在某种安全问题,但是,我可以在我的其他控制器中执行 POST 和 PUT,并且我没有看到任何差异,我认为这是导致问题的原因。

这是我的代码的 sn-p:

public class PricesController : ApiController
{
    // DELETE: api/Prices/5
    [HttpDelete]
    [ResponseType(typeof(Price))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> DeletePrice(int id)
    {
      // code omitted
    }

    // GET: api/Prices/5
    [HttpGet]
    [ResponseType(typeof(Price))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> GetPrice(int id)
    {
      // code omitted
    }

    // GET: api/Prices
    [HttpGet]
    [Route("api/Prices")]
    public IQueryable<Price> GetPrices()
    {
      // code omitted
    }

    // POST: api/Prices
    [HttpPost]
    [ResponseType(typeof(Price))]
    [Route("api/Prices", Name = "Prices")]
    public async Task<IHttpActionResult> PostPrice(Price price)
    {
      // code omitted
    }

    // PUT: api/Prices/5
    [HttpPut]
    [ResponseType(typeof(void))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> PutPrice(int id, Price price)
    {
      // code omitted
    }
}

任何帮助将不胜感激。我花了一整天的时间试图弄清楚这一点。

【问题讨论】:

  • 有几件事要检查。确保在 WebApiConfig 中基于约定的路由之前启用属性路由。检查 web.config 以确保处理程序中的路径允许动词。还显示您如何调用这些操作。你用什么网址
  • 属性路由已启用,我一直在使用它。此应用程序中有 56 个其他控制器,其中大多数支持 GET、DELETE、POST 和 PUT 操作。客户端使用 Angular 1.x 和资源,同样,这是在我没有遇到此问题的整个应用程序中使用的类似模式。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example

标签: rest asp.net-web-api2 attributerouting


【解决方案1】:

听起来好像没有正确绑定。

您可以尝试在您的操作中使用 [FromBody] 来装饰 Price 吗?

PostPrice([FromBody] Price price)

【讨论】:

  • 我试过了,没有区别。我不需要在应用程序的其他任何地方使用该属性。我有很多其他非常相似的控制器没有这个问题。
  • 请求的内容类型是否设置为application/json?
  • 是的,客户端应用程序是 Angular 1.x 并且相当大。到目前为止,一切正常,但缺少此特定功能,因此我正在添加它。我编写了大部分应用程序,因此我非常熟悉它。
  • 既然你提到它是一个大应用程序,你确定路由/api/prices没有被使用?
  • @Noel 如果有冲突的路线,它会给出不同的错误。
猜你喜欢
  • 2013-03-21
  • 2018-02-04
  • 2016-03-23
  • 2018-05-27
  • 1970-01-01
  • 2014-06-11
  • 2014-08-21
  • 2016-04-18
  • 2012-09-30
相关资源
最近更新 更多