【问题标题】:Web API 2 DELETE method always returns 500Web API 2 DELETE 方法总是返回 500
【发布时间】:2014-11-30 23:37:26
【问题描述】:

我在我的Email Web API 2 控制器上有一个操作:

[Authorize]
[RoutePrefix("api/Email")]
public class EmailController : ApiController {

    //...

    [HttpDelete]
    [Route("Remove/{id}")]
    private void Remove(int id) {
        _repo.Remove(id);
    }
}

当我使用 DELETE http://localhost:35191/api/Email/Remove/35571(或通过任何其他方法)从 Fiddler 调用操作时,我会收到带有通用 IIS 错误页面的 500 回复,该页面没有给我任何有关错误的信息。

似乎在我的操作被调用之前就发生了错误,因为在操作中设置断点会导致断点永远不会被命中。

是否需要某种配置才能在 IIS (Express) 中允许 DELETE 方法?

我已尝试在我的 web.config 中明确允许 DELETE

  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

但无济于事。

【问题讨论】:

  • 你是否在 Fiddler 中安装了 SyntaxView(它通常包含有关错误的更多详细信息)?
  • 显示您的路由。 ApiController 上是否有 [RoutePrefix(...)] 属性?是api/Email吗?此外,我相信您的控制器类和操作方法都必须是public
  • SyntaxView 只为我提供了 IIS 提供给我的 HTML 页面的语法高亮版本。
  • 为什么你的方法是私有的?
  • @Jonesy,哇......我不敢相信我错过了。

标签: c# asp.net-web-api2 iis-express http-delete


【解决方案1】:

你必须让你暴露的方法public:

[HttpDelete]
[Route("Remove/{id}")]
public void Remove(int id) {
    _repo.Remove(id);
}

如果这不起作用,那么您可能需要删除 WebDav(web.config):

<system.webServer>
   <modules>
      <remove name="WebDAVModule" />
   </modules>
   <handlers>
      <remove name="WebDAV" />
   </handlers>
</system.webServer>

【讨论】:

  • 我不敢相信我错过了。谢谢。
  • 添加删除 WebDAV 修复了它。路线没有影响。
  • 通过删除 webdav 我知道它解决了问题,但它还删除了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2015-08-08
  • 2019-10-28
  • 2019-04-02
  • 2022-01-27
  • 2021-09-24
相关资源
最近更新 更多