IIS中ASP.Net Core 2.0调用PUT/DELETE接口返回405状态码求助
解决IIS部署ASP.NET Core 2.0时PUT/DELETE返回405的有效方案
我之前也碰到过一模一样的问题——ASP.NET Core应用在Ubuntu上跑完全正常,一部署到IIS就卡PUT/DELETE的405错误,常规方法试了个遍都没用,最后折腾出几个靠谱的解决办法,你可以按顺序试试:
方案一:彻底禁用WebDAV(最推荐,亲测有效)
之前你直接移除WebDAVModule导致500,是因为没处理好依赖和优先级问题。正确的做法是在web.config里先禁用WebDAV的处理程序,再移除模块,同时确保ASP.NET Core的处理器优先级最高。完整配置片段如下:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <!-- 确保aspNetCore处理器在WebDAV移除之后,保证优先处理请求 --> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" /> </system.webServer>
注意:如果你的项目用的是旧版ASP.NET Core模块,把AspNetCoreModuleV2改成AspNetCoreModule就行。
方案二:站点级禁用WebDAV(解决继承配置问题)
如果修改web.config还是没用,大概率是站点继承了服务器级的WebDAV配置,得去IIS管理器里手动操作:
- 打开你的目标站点,找到WebDAV Authoring Rules
- 点击右侧面板的Disable WebDAV(如果看不到这个选项,先在服务器角色里安装WebDAV组件,不用启用任何规则,只是为了能看到禁用选项)
- 接着去站点的Handler Mappings,确认
aspNetCore处理器的Verbs设置为*(允许所有HTTP方法)
方案三:检查Request Filtering的Verb限制
你之前试过配置但没生效?可能是没做到位:
- 打开站点的Request Filtering,切换到Verbs标签
- 点击Allow Verb,手动添加
PUT和DELETE - 同时检查列表里有没有
Deny Verb条目包含这两个方法,有的话直接删掉 - 别忘了去服务器级的Request Filtering里也检查一遍,避免全局限制
方案四:确认ASP.NET Core的路由配置
虽然Ubuntu上正常,但还是要排查下代码层面的路由问题:
- 如果用的是传统路由,确保
Startup.cs里的路由配置没有限制HTTP方法:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
- 如果用属性路由,检查控制器方法上的
[HttpPut]/[HttpDelete]标签有没有拼写错误,比如:
[HttpPut("{id:int}")] // 确保路由参数约束正确 public IActionResult Update(int id, [FromBody] YourModel model) { // 业务逻辑 }
方案五:检查应用程序池设置
确保你的应用程序池Managed Pipeline Mode是Integrated,ASP.NET Core模块需要集成模式才能正常处理所有HTTP方法,Classic模式下很容易出问题。
如果以上方法都试过还是不行,建议开启ASP.NET Core的日志排查:把web.config里的stdoutLogEnabled="true",然后看logs目录下的日志,就能知道请求是在IIS层面被拦截了,还是压根没到你的应用代码里。
内容的提问来源于stack exchange,提问作者twreynol




