Azure及IIS部署API报405错误 本地正常页面无法访问如何解决
Web API部署到Azure/IIS触发405错误排查方案
405错误本质是请求所用的HTTP方法未被服务端允许,本地运行正常但部署后报错,基本为服务端模块拦截、配置不匹配导致,按以下步骤逐一排查即可:
1. 基础匹配校验
- 核对请求使用的HTTP方法(GET/POST/PUT/DELETE/PATCH/OPTIONS等)和接口声明的方法特性完全一致,例如接口标注
[HttpPost]时,PUT、DELETE类请求会被直接拦截。 - 核对路由规则,确认部署环境的路由前缀、参数约束和本地配置完全一致,注意部分部署环境对路由大小写敏感,避免因大小写不匹配触发路由失效。
2. 移除WebDAV模块拦截
这是IIS、Azure App Service环境下最常见的405诱因,平台默认集成的WebDAV模块会拦截PUT、DELETE、PATCH等非GET/POST类请求,直接在项目根目录的web.config中添加配置移除该模块即可:
<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
3. 修正无扩展请求处理程序配置
默认的无扩展URL处理程序可能未开放全量HTTP方法权限,需手动在web.config中补充配置:
针对ASP.NET Framework项目
<system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
针对ASP.NET Core项目
确认AspNetCore模块配置未限制请求谓词:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> </system.webServer>
4. 排查CORS预检请求拦截
前后端分离场景下,浏览器会在跨域请求前自动发送OPTIONS方法的预检请求,若CORS配置错误也会返回405:
- 不要同时在代码层面和IIS/Azure门户层面重复配置CORS规则,避免规则冲突。
- ASP.NET Core项目需注意CORS中间件的注册顺序,必须放在路由、授权中间件之前:
// 正确顺序示例 var builder = WebApplication.CreateBuilder(args); builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod(); }); }); // ... 其他服务注册 var app = builder.Build(); app.UseCors(); // 必须放在UseRouting之前 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
5. Azure环境专属排查
- 在Azure门户的应用服务配置中开启失败请求跟踪,查看405请求的详细处理日志,定位具体拦截的模块。
- 检查是否配置了WAF、API Management规则,部分默认防护规则会拦截非常规HTTP方法,按需调整规则即可。
- 确认Azure应用的运行时栈版本和本地开发环境完全一致,避免因版本不兼容导致路由、处理程序加载异常。
6. IIS环境专属排查
- 打开IIS管理器,找到对应站点的「处理程序映射」,选中项目对应的处理程序,在请求限制的谓词设置中,确认已开放所有需要使用的HTTP方法,或直接选择允许所有谓词。
- 打开「请求筛选」模块,检查「HTTP谓词」列表,确认使用的请求方法没有被加入拒绝列表。
报错参考截图

内容的提问来源于stack exchange,提问作者anum ali
相关产品推荐
相关产品推荐

