.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
相关产品推荐
相关产品推荐

