IIS部署API返回405 Method Not Allowed,本地正常求助
解决IIS部署API后返回405状态码的方案
问题描述
API本地运行时,通过DELETE请求调用/api/values/DegerSil/S00001/返回200状态码;部署到IIS后,相同请求返回405 Method Not Allowed,Flutter端使用http.delete发起请求。
排查与解决步骤
启用IIS的DELETE谓词
打开IIS管理器,进入目标API站点的「请求筛选」→「HTTP谓词」,确认DELETE在允许列表中,若没有则添加该谓词并保存。禁用WebDAV模块
WebDAV会拦截DELETE、PUT等请求,是405错误的常见诱因:- 进入站点的「模块」功能,删除
WebDAVModule; - 或直接修改站点根目录的
web.config,添加以下配置:
- 进入站点的「模块」功能,删除
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
校验API路由一致性
确认IIS部署环境的路由与本地一致:若站点配置了虚拟目录,Flutter请求URL需添加虚拟目录前缀,例如http://192.168.0.21/虚拟目录/api/values/DegerSil/S00001/。配置CORS允许DELETE方法
若Flutter应用与API跨域,需在API后端的CORS配置中明确允许DELETE方法(以ASP.NET为例):
builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowMethods("GET", "POST", "PUT", "DELETE"); }); });
- 检查IIS身份验证设置
若API无需身份验证,确保站点启用「匿名身份验证」;若需验证,确认配置的身份验证方式与请求匹配,避免权限拦截。
你的Flutter请求代码
void TraSil() async { try { String uri = 'http://192.168.0.21/api/values/DegerSil/S00001/'; Uri ur = Uri.parse(uri); final response = await http.delete(ur).timeout(const Duration(seconds: 30)); if (response.statusCode == 200) { print("Deleted"); } else { throw response.reasonPhrase.toString(); } } catch (e) { _showMyDialog("Hata", e.toString()); } }
内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez
相关产品推荐
相关产品推荐

