C# 获取WebAPI2中的PUT和DELETE谓词以在IIS 8.5上工作
我试图将代码发布到我的公司测试web服务器,当我试图使用PUT或DELETE动词调用任何方法时,IIS返回了大量错误。我研究过这个特殊的问题,我尝试过的所有结果要么什么都不做,要么产生一个新的错误。当我尝试使用默认system.webServer配置时,我收到了general 405 method not allowed错误,下面是web.config的该部分:C# 获取WebAPI2中的PUT和DELETE谓词以在IIS 8.5上工作,c#,asp.net,iis,asp.net-web-api,web-config,C#,Asp.net,Iis,Asp.net Web Api,Web Config,我试图将代码发布到我的公司测试web服务器,当我试图使用PUT或DELETE动词调用任何方法时,IIS返回了大量错误。我研究过这个特殊的问题,我尝试过的所有结果要么什么都不做,要么产生一个新的错误。当我尝试使用默认system.webServer配置时,我收到了general 405 method not allowed错误,下面是web.config的该部分: <system.webServer> <validation validateIntegratedModeCon
<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>
更新
我在应用程序上运行了一个跟踪,我看到GET和POST命令到达了站点,但是PUT或DELETE命令都没有到达站点:
我不认为这是问题的答案,但它至少允许我解决这个问题,直到我们可以卸载WebDAV,并希望这将允许我的Web Api 2应用程序正常工作。您需要应用
[HttpPut]
和[HttpDelete]
各操作的属性
[HttpPut]
public string PutRegistrationBatch(RegistrationBatch Model) { ... }
[HttpDelete]
public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
在配置文件中,您还应该尝试使用您希望允许的特定动词
如果安装了WebDAV IIS功能,可能会与Put、Delete和Patch请求发生冲突(可能更多…记不起来)。您可以在服务器范围内卸载该功能,也可以从system.webServer元素中手动删除HttpModule和HttpHandler,以针对此特定应用程序。看我记得不久前我也进过类似的沟。最终这对我起了作用
将“默认网站”和网站的所有模块配置重置为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>
您有权访问应用程序日志吗?内部服务器错误可能意味着您的应用程序逻辑引发异常(例如,数据库授权错误)。我让我们的一名服务器管理员检查了服务器上的事件日志,但没有任何记录。您的应用程序是否具有跟踪功能?我会打开它以确保将请求移交给您的应用程序。我通过web.config启用了跟踪,但没有为应用程序生成跟踪文件。这可能意味着没有为站点安装/启用跟踪。我们仍然无法确定错误来自何处。我建议在应用程序中添加应用程序级跟踪/日志记录。我只是按照您的建议编辑了代码,但得到了相同的结果。没有明显区别。WebDAV安装在另一个应用程序的服务器上,但是正如我在原始帖子中提到的,通过web.config删除它实际上会导致进一步的问题。据我所知,WebDAV未列在我的应用程序的处理程序或模块中,但它列在服务器级别(和默认网站)上,我猜我需要将其从默认网站中删除,因为调用无法访问我的应用程序。您的应用程序池是以集成还是经典管道模式配置的?我问这个问题的原因是因为删除模块和处理程序有点不同(它在system.web的某个地方,而不是在经典模式下的system.webServer)。还要检查您是否有请求筛选设置(通过IIS管理控制台或在web.config中查找/
。还要检查C:\Windows\System32\inetsrv\config\applicationHost.config
和C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\web.config
(调整位/版本的路径)。我的应用程序的应用程序池是在集成模式下配置的。没有HTTP谓词的请求筛选设置,它只是设置为允许所有操作,除非列表中另有说明。但是,父级的默认网站是在经典模式下配置的,不确定这是否有任何区别。我之前注意到ExtensionlessUrlHandler处理程序映射到默认网站上,Integrated-4.0在服务器级别被禁用。我在服务器级别启用了它,但仍然没有效果。当ExtensionlessUrlHandler不工作时,我认为它通常甚至会影响GET请求。如果将GET请求添加到同一控制器,则会出现问题le with,你能确认它的路由是否正确吗?尝试安装RoutedBugger以验证路由是否正常工作。405是WebDav。500 w/WebDav是被禁用的YSOD还是IIS 500页面?如果是后者,你的请求不会进入你的应用程序。在global.asax中为每个事件设置事件处理程序,并在每个事件中设置断点事件处理程序(调用GetHashCode或无副作用的东西&在所有事件上设置断点)我所有的POST和GET请求都可以在我的应用程序中工作,但PUT或DELETE请求都不能。500是一个IIS 500页面,我知道它无法进入我的应用程序,因为我启用了跟踪功能,并且看不到这些请求。关于调试,如果没有进一步的建议,我无法访问web服务器上的Visual Studio,我将与我们的网络团队联系,看看是否可以安装它来解决此问题。
[HttpPut]
public string PutRegistrationBatch(RegistrationBatch Model) { ... }
[HttpDelete]
public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
<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>