【发布时间】: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