我有一个带有控制器的Web Api项目,该控制器具有GET,DELETE,POST和PUT方法。Wep Api - 405方法不允许
当我尝试对此控制器执行POST或PUT时,我总是收到405方法不允许错误。正在发送的数据看起来有效,它只是一个具有六个简单属性的对象。我在我的方法中设置了一个断点,正如预期的那样,它不会受到影响。我注册了一个DelegatingHandler(在Web Api - Catch 405 Method Not Allowed处提到)来检查传入的请求和传出响应,我可以告诉我的请求正在被Api处理(意味着问题不在客户端)。我还使用Fiddler来检查请求/响应和响应标题,在安全性,允许:DELETE,GET下说。
这清楚地告诉我,由于某种原因,即使我已经用[HttpPost]和[HttpPut]属性装饰了方法,并且路由配置正确,我也不能说PUT和POST是允许的。我使用默认路由,但也有使用属性路由的方法。
这听起来像可能存在某种安全问题,但是,我可以在我的其他控制器中执行POST和PUT,并且我没有看到任何我认为会导致问题的原因。
这里是我的代码片段:
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以确保处理程序中的路径允许使用动词。也显示你如何称呼行动。你使用什么URL – Nkosi
属性路由已启用,我一直在使用它。此应用程序中有56个其他控制器,其中大多数都支持GET,DELETE,POST和PUT操作。客户端正在使用带有资源的Angular 1.x,同样,这是在整个应用程序中使用的类似模式,我没有这个问题。 – DesertFoxAZ
寻求调试帮助的问题(“**为什么不是这个代码工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身**中重现**所需的最短代码。没有**明确问题陈述**的问题对其他读者没有用处。请参阅:如何创建[mcve]。 – Nkosi