不允许使用 Web Api 2 方法 (405)

Posted

技术标签:

【中文标题】不允许使用 Web Api 2 方法 (405)【英文标题】:Web Api 2 Method Not Allowed (405) 【发布时间】:2016-04-18 10:38:19 【问题描述】:

我在 VS2013 中创建了一个默认的 Web Api 2 项目。我在控制器中的 PUT 操作如下所示:

    // PUT: api/Events/5
    [HttpPut]
    [ResponseType(typeof(void))]
    public IHttpActionResult PutEvent(int id, Event @event)
    
        if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

        if (id != @event.Id)
        
            return BadRequest();
        

        db.Entry(@event).State = EntityState.Modified;

        try
        
            db.SaveChanges();
        
        catch (DbUpdateConcurrencyException)
        
            if (!EventExists(id))
            
                return NotFound();
            
            else
            
                throw;
            
        

        return StatusCode(HttpStatusCode.NoContent);
    

我的 web.config 如下所示:

<handlers>
      <remove name="WebDAV"/>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

我的 WebConfig.cs 中有以下代码

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
);

当我运行项目并尝试使用 Postman 对 API 进行调用(使用原始 json 数据进行 PUT)时,服务器返回:

请求的资源不支持http方法'PUT'

我查看了this 的帖子,但看不出我在做什么不同(除了我添加了&lt;remove name="WebDAV" /&gt;)。但没有它也行不通。

【问题讨论】:

你使用的是HttpPut,所以你不能从url获取id,而是从[FromBody][FromUrl]作为参数参数。 你的控制器叫EventsController吗?你的Event @event 应该有一个[FromBody] 属性 @gauravbhavsar id 是问题所在。当我删除它时,问题就解决了 @kwv84 很高兴你解决了这个问题,请更新你的修复问题。 【参考方案1】:

原来我必须更改我的 PUT 操作并删除 id:

// PUT: api/Events/5
[HttpPut]
[ResponseType(typeof(void))]
public IHttpActionResult PutEvent(int id, Event @event)

    if (!ModelState.IsValid)
    
        return BadRequest(ModelState);
    

    if (id != @event.Id)
    
        return BadRequest();
    

    db.Entry(@event).State = EntityState.Modified;

    try
    
        db.SaveChanges();
    
    catch (DbUpdateConcurrencyException)
    
        if (!EventExists(id))
        
            return NotFound();
        
        else
        
            throw;
        
    

    return StatusCode(HttpStatusCode.NoContent);

【讨论】:

以上是关于不允许使用 Web Api 2 方法 (405)的主要内容,如果未能解决你的问题,请参考以下文章

Web Api - 不允许使用 Catch 405 方法

在 DELETE 上不允许使用 Owin 自托管 Web API 405 方法

MVC-Web API:不允许使用 405 方法

“无法在已发布的 Web API 上发布数据” – 405(不允许的方法)

405 方法不允许 Web API

错误 405 - IIS Express 10 不允许使用 CORS for Web API 的方法