500 PUT Web API出现内部服务器错误

本文关键字:内部 服务器 错误 PUT Web API | 更新日期: 2023-09-27 18:29:52

我有MVC Web API,它有POST和PUT函数;POST函数调用成功,但PUT函数调用失败,返回:

内部服务器错误;

函数是相同的"我一次使用一个函数,另一个会被注释;只是为了测试目的"。

public HttpResponseMessage Put(string id)
{
   HttpStatusCode statusCode = HttpStatusCode.OK;
   return Request.CreateResponse<string>(statusCode, id);
}
public HttpResponseMessage Post(string id)
{
   HttpStatusCode statusCode = HttpStatusCode.OK;
   return Request.CreateResponse<string>(statusCode, id);
}

编辑:它在我的机器上本地可以很好地进行POST和PUT(Windows 8.1);但当我把它移到另一台机器(Windows Server 2012)上时,只有POST功能可以工作。

500 PUT Web API出现内部服务器错误

当您不知道资源标识符时,使用POST创建资源。对于POST创建,最佳做法是返回"201已创建"的状态和新创建的资源的位置,因为在提交时其位置未知。这允许客户端稍后在需要时访问新资源

最后我找到了这个问题的解决方案,似乎WebDav中有一个问题,在某些情况下,将其从应用程序Web中删除是不够的。Config您应该按照本文中的步骤从IIS中禁用它如何在IIS 中禁用WebDav

当我发现WebDav到底有什么问题时,我会更新这个答案,这使得从应用程序Web.Config中删除它对于windows 2012来说不够,但在windows 8.1 中运行良好

我也遇到了同样的问题。PUT和DELETE端点在我在visualstudio中调试时工作,但在我部署到IIS时不工作。

我已经添加了这个

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="false">
      <remove name="WebDAVModule" />
    </modules>  
  </system.webServer>

在我的web.config中,所以我没有考虑WebDav。Ebraheem的回答让我仔细看了看WebDav。

最终IIS服务器在"功能和角色"中启用了WebDav发布。所以我删除了它,现在一切都如预期。

移除<remove name="WebDAVModule" />是不够的。我发现,您还必须专门从处理程序中删除它,并且为了确保允许使用谓词,您可以在安全节点中设置它们。以下是我在web.config中设置的内容,它允许放置和删除操作,而无需在IIS中设置任何内容。

<!-- After the <system.web> node -->
<system.webServer>
<handlers>
  <!-- default handler settings here if any -->
  <!-- Add the following to remove WebDAV handler -->
  <remove name="WebDAV" />
</handlers>
<modules runAllManagedModulesForAllRequests="false">
  <!-- Add the following to remove WebDAV module -->
  <remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<security>
<!-- Add the following to specifically allow the GET,POST,DELETE and PUT verbs -->
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="PUT" allowed="true" />
    </verbs>
  </requestFiltering>
</security>
</system.webServer>