我正在尝试将代码发布到我的公司测试Web服务器,并且当尝试使用PUT或DELETE谓词调用任何方法时,我收到了从IIS返回的大量错误。我已经研究过这个特殊问题,我尝试的所有结果都没有做任何事情,或者产生了新的错误。当我尝试使用默认的system.webServer配置时,我收到一般的405方法不允许错误,这里是web.config的那部分:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
从挖掘谷歌和几篇论文文章,大部分接受的答案都指定通过网络配置文件删除WebDAV,我已经完成了,这里是更新的代码:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
当我尝试使用刚删除WebDAV处理程序时,我继续得到405方法不允许错误,但是一旦我删除了WebDAVModule,我的错误就变成500内部服务器错误,并且从服务器查看不实际上给我任何进一步的信息。
我还试图围绕删除和添加“ExtensionlessUrlHandler-ISAPI-4.0_32bit”&amp ;; “ExtensionlessUrlHandler-ISAPI-4.0_64bit”处理程序,具有相同的结果(当不删除WebDAVModule时为405,当我删除它时为500)。
这是我试图调用的WebApi控制器上的方法,也许这就是问题所在,虽然它在我的开发环境中运行良好:
public string PutRegistrationBatch(RegistrationBatch Model) {
// Code to save the model to our database
}
public string DeleteRegistrationBatch(RegistrationBatch Model) {
// Code to delete the item from the database
}
更新
我在应用程序上运行了跟踪,我看到GET和POST命令通过该站点,但没有PUT或DELETE命令通过该站点:
似乎PUT和DELETE命令在主机级别被过滤掉并被拒绝,而且从未进入我的应用程序。
更新
似乎WebDAV是潜在的问题,但我们运行的是利用此技术的Web服务,因此在我们更新该服务之前删除它不是一种选择。与此同时,我发现Scott Hanselman在此处概述的工作(http://www.hanselman.com/blog/HTTPPUTOrDELETENotAllowedUseXHTTPMethodOverrideForYourRESTServiceWithASPNETWebAPI.aspx)允许我作为POST请求发送PUT和DELETE请求。
我不建议这是问题的答案,但它至少允许我解决问题,直到我们可以卸载WebDAV,并希望这将允许我的Web Api 2应用程序工作正常。
答案 0 :(得分:0)
您需要在相应的操作上应用[HttpPut]
和[HttpDelete]
属性
[HttpPut]
public string PutRegistrationBatch(RegistrationBatch Model) { ... }
[HttpDelete]
public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
在配置文件中,您还应该尝试使用您想要允许的特定动词
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
答案 1 :(得分:0)
如果您安装了WebDAV IIS功能,它可能会导致与Put,Delete和Patch请求发生冲突(可能更多...不记得了)。您可以从服务器范围卸载功能部件,也可以从system.webServer元素中手动删除HttpModule和HttpHandler以定位此特定应用程序。见https://stackoverflow.com/a/26003440/179223
答案 2 :(得分:0)
我记得以前有过类似的沟渠。最终这对我有用。
将“默认网站”和您的网站的所有模块配置重置为IIS中的默认值。你可以这样做 1.选择您的网站,双击“模块” 2.单击右侧“动作”面板下的“还原为父对象”链接
在Web.config中使用以下内容
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>