IIS部署下PATCH请求丢失请求体,本地运行正常的问题排查
排查IIS部署下ASP.NET Core PATCH请求体无法识别的问题
针对你遇到的.NET 6 Web API在IIS上PATCH请求返回400(提示请求体为空、patch字段必填),本地正常的问题,可按以下步骤排查:
1. 确保IIS允许PATCH请求方法
默认IIS的请求筛选可能未开启对PATCH方法的支持,导致请求被拦截。需在站点的web.config中添加配置,明确允许PATCH:
<system.webServer> <security> <requestFiltering> <verbs> <!-- 允许PATCH方法 --> <add verb="PATCH" allowed="true" /> </verbs> </requestFiltering> </security> </system.webServer>
也可通过IIS管理器操作:站点 → 请求筛选 → HTTP谓词 → 添加,输入PATCH并勾选允许。
2. 排除静态内容模块干扰
IIS的静态内容模块可能优先处理PATCH请求,导致ASP.NET Core无法获取请求体。可在web.config的处理程序映射中,确保ASP.NET Core模块不依赖静态内容模块:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> </system.webServer>
若之前配置了StaticFileModule,需移除或确保AspNetCoreModuleV2优先级更高。
3. 验证请求的Content-Type是否正确
JSON Patch请求要求Content-Type必须为application/json-patch+json,而非普通的application/json。本地环境可能宽松兼容,但IIS部署后,ASP.NET Core的模型绑定会严格校验该类型,若客户端未正确设置,会导致请求体无法解析,触发空值验证错误。
4. 检查URL重写或中间件是否修改请求体
若站点配置了URL重写规则,或ASP.NET Core中存在提前读取请求体的中间件,可能导致后续模型绑定无法读取请求体:
- 检查
web.config中的<rewrite>节点,确保规则未截断PATCH请求的内容; - 检查Program.cs中的中间件顺序,避免在模型绑定前调用读取请求体的逻辑(如
Request.Body.ReadAsync)。
5. 启用请求日志排查
在IIS上开启ASP.NET Core的stdout日志,或在Program.cs中添加请求日志中间件,查看请求到达服务器时的完整内容,确认请求体是否确实被传输:
// Program.cs中添加请求日志 app.UseMiddleware<RequestLoggingMiddleware>(); // 自定义日志中间件示例 public class RequestLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILogger<RequestLoggingMiddleware> _logger; public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext context) { // 读取请求体 context.Request.EnableBuffering(); var body = await new StreamReader(context.Request.Body).ReadToEndAsync(); _logger.LogInformation("Request Body: {Body}", body); context.Request.Body.Position = 0; // 重置流位置,确保后续能读取 await _next(context); } }
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

