IIS经典模式下PUT/DELETE方法失效的兼容解决方案咨询
解决IIS经典模式下.NET Web API PUT/DELETE方法失效问题
针对你在IIS 10经典模式下Web API PUT/DELETE方法失效的问题,以下是可行的解决办法:
1. 替换Web.config中的Handler配置
你的当前配置里使用的是集成模式专属的ExtensionlessUrlHandler-Integrated-4.0,经典模式下该处理器不会生效。需要替换为经典模式适用的处理器:
修改<system.webServer>下的<handlers>节点:
<handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <remove name="WebDAV" /> <!-- 额外移除WebDAV处理器 --> <!-- 添加经典模式的无扩展名URL处理器 --> <add name="ExtensionlessUrlHandler-Classic-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="classicMode,runtimeVersionv4.0" /> </handlers>
2. 完全禁用WebDAV模块
仅禁用模块可能不够,需要在<system.webServer>里同时移除WebDAV模块和处理器:
<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules>
runAllManagedModulesForAllRequests="true"确保所有托管模块(包括Web API的路由模块)能处理所有请求,这在经典模式下尤为重要。
3. 检查IIS请求筛选设置
确认IIS未拒绝PUT/DELETE动词:
- 打开IIS管理器,找到你的站点
- 进入请求筛选功能,切换到HTTP动词标签
- 确保PUT和DELETE不在“拒绝的动词”列表中,若存在则删除;若默认规则拒绝,可添加允许规则
4. 验证应用程序池配置
- 确认应用程序池的**.NET CLR版本**设置为
v4.0.x(与你的Web API框架版本匹配) - 托管管道模式保持经典不变
修改后的完整Web.config示例
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="DBConnection" connectionString="*****" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <remove name="WebDAV" /> <add name="ExtensionlessUrlHandler-Classic-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="classicMode,runtimeVersionv4.0" /> </handlers> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> </configuration>
原理说明
集成模式下IIS与ASP.NET共享统一请求管道,Web API的路由模块能直接处理PUT/DELETE请求;而经典模式采用传统ISAPI映射,必须通过正确的处理器映射,让无扩展名的请求传递到ASP.NET运行时,同时确保WebDAV不会拦截PUT/DELETE动词。
内容的提问来源于stack exchange,提问作者gandhi
相关产品推荐
相关产品推荐

