.NET Core Web API控制器接收特殊字符丢失问题(C#)
.NET Core Web API 正确接收特殊字符的解决方案
问题场景
我在业务中需要处理特殊字符,向.NET Core Web API发送的请求负载如下:
{sortBy: "title", isSortAscending: false, page: 1, pageSize: 5, quickSearch: "Magič"}
传入的quickSearch值为"Magič",但调用api/GetProducts端点后,服务端接收该属性时显示异常。尝试在startup.cs中配置波斯尼亚相关文化信息(bs-Latn-BA、bs),但均未生效。
解决方法
1. 确保客户端请求使用UTF-8编码
客户端发送请求时,必须明确指定请求头Content-Type: application/json; charset=utf-8,避免因编码缺失导致特殊字符损坏。
- 代码示例(HttpClient):
var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // 明确指定UTF-8编码构造请求内容 var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); var response = await client.PostAsync("api/GetProducts", content); - Postman测试时,在Headers面板手动添加该请求头。
2. 配置API的JSON序列化编码
在Program.cs(.NET 6+)或Startup.cs(.NET Core 3.x及更早)中,配置JSON序列化器支持全Unicode字符:
// .NET 6+ Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { // 启用全Unicode字符支持 options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All); });
3. 正确配置请求本地化中间件
之前仅设置线程文化未生效,是因为缺少请求本地化中间件的配置。添加以下代码:
// .NET 6+ Program.cs builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("bs-Latn-BA") }; options.DefaultRequestCulture = new RequestCulture("bs-Latn-BA"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); // 在中间件管道中启用本地化 var app = builder.Build(); app.UseRequestLocalization();
4. 验证服务端接收编码
在控制器方法中添加编码验证,排查问题环节:
[HttpPost("GetProducts")] public IActionResult GetProducts([FromBody] ProductRequest request) { // 将接收的字符串转为UTF-8十六进制,验证"č"是否为C4 8D var bytes = Encoding.UTF8.GetBytes(request.quickSearch); var hex = BitConverter.ToString(bytes); return Ok(new { ReceivedValue = request.quickSearch, Utf8Hex = hex }); }
内容的提问来源于stack exchange,提问作者Roxy'Pro
相关产品推荐
相关产品推荐

