You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:41:34