You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,手动添加PUTDELETE
  • 同时检查列表里有没有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 ModeIntegrated,ASP.NET Core模块需要集成模式才能正常处理所有HTTP方法,Classic模式下很容易出问题。

如果以上方法都试过还是不行,建议开启ASP.NET Core的日志排查:把web.config里的stdoutLogEnabled="true",然后看logs目录下的日志,就能知道请求是在IIS层面被拦截了,还是压根没到你的应用代码里。


内容的提问来源于stack exchange,提问作者twreynol

火山引擎 最新活动