2017-04-14 121 views
0

我有一个带有控制器的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 
    } 
} 

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

+0

有几件事要检查。确保在WebApiConfig中基于约定的路由之前启用属性路由。检查web.config以确保处理程序中的路径允许使用动词。也显示你如何称呼行动。你使用什么URL – Nkosi

+0

属性路由已启用,我一直在使用它。此应用程序中有56个其他控制器,其中大多数都支持GET,DELETE,POST和PUT操作。客户端正在使用带有资源的Angular 1.x,同样,这是在整个应用程序中使用的类似模式,我没有这个问题。 – DesertFoxAZ

+0

寻求调试帮助的问题(“**为什么不是这个代码工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身**中重现**所需的最短代码。没有**明确问题陈述**的问题对其他读者没有用处。请参阅:如何创建[mcve]。 – Nkosi

回答

0

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

你可以尝试装饰价格与[FromBody]之前它在你的行动?

PostPrice([FromBody] Price price) 
+0

我试过了,它没有区别。我不需要在应用程序的其他任何地方使用该属性。我有很多其他类似的控制器没有这个问题。 – DesertFoxAZ

+0

请求的内容类型是否设置为application/json? – Eilimint

+0

是的,客户端应用程序是Angular 1.x,并且相当大。到目前为止,一切正常,但这个特殊的功能缺失,所以我加入了它。我写了大部分的应用程序,所以我对它非常熟悉。 – DesertFoxAZ