被覆盖的 Web API 方法返回“方法不允许”

Posted

技术标签:

【中文标题】被覆盖的 Web API 方法返回“方法不允许”【英文标题】:Overridden Web API Method Returns "Method Not Allowed" 【发布时间】:2018-07-19 07:56:04 【问题描述】:

我有一个执行 CRUD 的通用 Web API 控制器,如下所示:

public class BaseController : ApiController 
        [HttpPost]
        public virtual IHttpActionResult Post(T entity)
        
            return Ok();
        

        [HttpPut]
        public virtual IHttpActionResult Put(T entity)
        
            return Ok();
        

ObjectController 派生自 BaseController 但它覆盖了 Put 方法

public class ObjectController : BaseController 
    [HttpPut]
    [Route("api/Object")]
    public override IHttpActionResult Put(T entity)
    
        return Ok();
    

当没有被覆盖时,调用控制器中的所有方法没有问题。例如,

public class Object2Controller : BaseController  

调用 POST 方法返回 405 方法不允许。 我的代码有什么问题?

EDIT这不是一个重复的问题,因为我可以在其他控制器中调用 PUT。

EDIT 2 将 new 更改为 override(virtual) 但仍然出现相同的错误

EDIT 3提供了一个工作控制器

【问题讨论】:

这没有被覆盖,你只是隐藏了原始方法。 BaseController 应该声明public virtual IHttpActionResult Put(T entity),ObjectController 应该声明public override IHttpActionResult Put(T entity)。请参阅 here 了解新的 vs 覆盖。 你的请求的 Uri 是什么 @rajeemcariazo 如果您可以在其他控制器中使用 PUT,则没有理由追逐 WebDAV。您必须将基本 PUT 设为虚拟,否则请使用 override 关键字,因为现在您没有覆盖任何内容。 @rajeemcariazo 你不能只说“我可以在其他控制器中使用 PUT”。您必须提供一个可重现的示例,并且提供您的web.config,这样人们就不必猜测WebDAV。什么 URL 导致了问题?与其他 PUT 相比,它有什么不同吗?如果您不提供实际的配置、URL、代码,人们将不得不猜测以尝试重现问题 @rajeemcariazo 没有这些信息,恐怕这个问题将不得不关闭。此外,我怀疑只是尝试创建一个新的、简单的 Web API 项目来展示相同的问题,要么不会重现它,要么会告诉你哪里出了问题。错过了 web.config 设置?还是 one 应用程序池/虚拟目录上的 WebDAV 设置?您是否将 Areas 与他们自己的 web.config 一起使用?尝试在 SharePoint 根目录下托管? 【参考方案1】:

为什么不在基类中使用 VIRTUAL 关键字? .. VIRTUAL 专门用于让开发人员覆盖派生类中的方法

类似:

public class BaseController : ApiController 
        [HttpPost]
        public virtual  IHttpActionResult Post(T entity)
        
            return Ok();
        

        [HttpPut]
        public virtual IHttpActionResult Put(T entity)
        
            return Ok();
        

然后:

public  class ObjectController : BaseController 
    [HttpPut]
    [Route("api/Object")]
    public override IHttpActionResult Put(T entity)
    
        return Ok();
    

希望对你有帮助!

【讨论】:

我仍然收到不允许的 405 方法 @rajeemcariazo 发布了一个 reproducible 示例。除了代码中明显的错误之外,人们无法猜测项目的其余部分是什么样的 您也可以发布您的前端代码吗? .. 导致错误看起来您使用了错误的动词

以上是关于被覆盖的 Web API 方法返回“方法不允许”的主要内容,如果未能解决你的问题,请参考以下文章

405 方法不允许 Web API 2

405 方法不允许 Web API

405 方法不允许 - ASP.NET Web API

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

为什么Java 8接口方法中不允许“final”?

Altium AD20中铺铜被导线分割的解决方法,如何正确覆铜整片区域