被覆盖的 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 方法返回“方法不允许”的主要内容,如果未能解决你的问题,请参考以下文章