【问题标题】:Overridden Web API Method Returns "Method Not Allowed"被覆盖的 Web API 方法返回“方法不允许”
【发布时间】: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 根目录下托管?

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案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 示例。除了代码中明显的错误之外,人们无法猜测项目的其余部分是什么样的
  • 您也可以发布您的前端代码吗? .. 导致错误看起来您使用了错误的动词
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2016-05-15
  • 2018-02-04
相关资源
最近更新 更多