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

.NET Core WebAPI部署IIS后JSON特殊字符接收乱码问题

.NET Core WebAPI部署IIS时土耳其语特殊字符POST请求乱码解决方案

问题根因

IIS中传统的.NET全球化配置仅对.NET Framework站点生效,.NET Core的请求解析、JSON序列化链路是独立运行的,之前修改的UTF-8配置不会作用于Core站点。乱码本质是请求体读取、JSON反序列化环节未按UTF-8编码解析内容。

分步修复方案

1. 强制请求管道使用UTF-8编码

在项目启动配置中显式指定请求读取、请求头解析的默认编码为UTF-8:

  • .NET 6+ 最小API模型,在Program.cs中添加如下配置:
using System.Text;

// 配置表单/请求体默认读取编码
builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options =>
{
    options.Encoding = Encoding.UTF8;
});

// 配置Kestrel服务器请求/响应头编码
builder.WebHost.ConfigureKestrel(options =>
{
    options.RequestHeaderEncodingSelector = _ => Encoding.UTF8;
    options.ResponseHeaderEncodingSelector = _ => Encoding.UTF8;
});
  • .NET 5及更早版本,在Startup.cs的ConfigureServices方法中添加上述FormOptions配置即可。

注意:web.config中的<globalization>节点仅对.NET Framework站点有效,无需在Core站点中配置该节点。

2. 校验JSON序列化配置

.NET Core默认JSON序列化器均原生支持UTF-8编码,若之前手动修改过序列化配置,需排查错误配置:

  • 使用默认System.Text.Json序列化器时,不要配置限制Unicode字符范围的编码器,保持默认配置即可:
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 若存在自定义JavaScriptEncoder.Create(...)限定字符范围的配置,直接删除
    });
  • 使用Newtonsoft.Json作为序列化器时,确认没有手动指定非UTF-8的编码规则。

3. 校验发布后的web.config配置

检查站点发布目录下的web.config,确认<system.webServer>节点下无错误的编码重写规则,且AspNetCore模块配置正确,参考配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\你的项目入口dll文件名.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

4. 校验客户端请求头

即使客户端实际发送内容为UTF-8编码,也必须在请求头中明确声明编码,否则服务端会按服务器系统默认编码解析内容。确保POST请求的Content-Type头格式如下:

Content-Type: application/json; charset=utf-8

问题定位调试方法

若按上述配置修改后仍存在问题,可在控制器方法中临时添加代码读取原始请求体,快速定位故障环节:

[HttpPost]
[Route("register")]
public async Task<IssiueType> Register([FromBody]Dto issue)
{ 
    // 临时调试代码
    Request.EnableBuffering();
    using var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true);
    var rawContent = await reader.ReadToEndAsync();
    Request.Body.Position = 0;
    // 断点查看rawContent:
    // - 如果rawContent中土耳其字符正常,但是issue.detail字段乱码,故障点为JSON反序列化配置
    // - 如果rawContent本身就是乱码,故障点为请求编码配置/客户端请求头声明错误

    // 原有业务逻辑
    return responseDto;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:09:16