.NET Core API部署IIS后,Ubuntu下cURL请求出现字符编码问题
解决.NET Core API部署IIS后接收Linux cURL请求的查询字符串乱码问题
问题本质
你遇到的乱码(تست对应波斯语تست)是典型的**UTF-8字节被错误解析为单字节编码(如ISO-8859-1/Latin-1)**导致的 mojibake(乱码)。Kestrel默认处理UTF-8编码的URL参数,但IIS转发请求时可能未正确配置编码规则,或API请求解析逻辑未强制UTF-8。
分步解决方法
1. 验证cURL请求的参数编码
首先确认Ubuntu端的curl是否正确传递UTF-8编码的参数:
- 直接使用URL编码后的参数发起请求(
تست的UTF-8 URL编码为%D8%AA%D8%B3%D8%AA):curl "https://your-api-domain/api/your-endpoint?text=%D8%AA%D8%B3%D8%AA" - 若直接使用波斯语字符串请求,先检查Ubuntu shell的编码是否为UTF-8:
若shell编码非UTF-8,执行echo $LANG # 应输出类似 "fa_IR.UTF-8" 或 "en_US.UTF-8"export LANG=fa_IR.UTF-8后再发起请求。
2. 强制IIS使用UTF-8解析URL
在站点根目录的web.config中添加编码配置,覆盖IIS默认的单字节编码规则:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <!-- 强制请求编码为UTF-8 --> <rewrite> <rules> <rule name="Force UTF-8 URL Encoding" stopProcessing="true"> <match url=".*" /> <serverVariables> <set name="HTTP_CONTENT_TYPE" value="application/x-www-form-urlencoded; charset=utf-8" /> </serverVariables> <action type="None" /> </rule> </rules> </rewrite> </system.webServer> <system.web> <globalization requestEncoding="utf-8" responseEncoding="utf-8" /> </system.web> </configuration>
3. 配置.NET Core API强制UTF-8解析
在Program.cs中添加请求本地化和编码配置,确保API始终以UTF-8解析查询字符串:
var builder = WebApplication.CreateBuilder(args); // 配置请求本地化,强制使用UTF-8编码 builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { "fa-IR", "en-US" }; options.DefaultRequestCulture = new RequestCulture("fa-IR", "fa-IR"); options.SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList(); options.SupportedUICultures = options.SupportedCultures; }); // 确保路由和查询字符串处理使用UTF-8 builder.Services.Configure<RouteOptions>(options => { options.LowercaseUrls = true; options.LowercaseQueryStrings = true; }); var app = builder.Build(); // 启用请求本地化中间件 app.UseRequestLocalization(); // 其他中间件配置... app.Run();
4. 检查IIS应用池设置
- 确保应用池的**.NET CLR版本**设置为
无托管代码(.NET Core应用不需要传统ASP.NET托管环境),避免旧编码规则干扰。 - 确认应用池的高级设置中,
启用32位应用程序选项与你的API部署架构匹配(64位应用需关闭此选项)。
5. 调试API参数编码
在接口中添加调试代码,确认参数的字节编码是否正确:
[HttpGet("your-endpoint")] public IActionResult GetTest([FromQuery] string text) { // 输出参数的UTF-8字节十六进制值 var utf8Bytes = Encoding.UTF8.GetBytes(text); var hexString = BitConverter.ToString(utf8Bytes).Replace("-", ""); // 正确的"تست"UTF-8十六进制应为 D8AAD8B3D8AA return Ok(new { ReceivedText = text, Utf8Hex = hexString }); }
如果返回的Utf8Hex是C398C2AAC398C2B3C398C2AA,说明参数被IIS以ISO-8859-1解析后再次转码,需回到步骤2检查web.config配置。
内容的提问来源于stack exchange,提问作者Saeed Gholamzadeh
相关产品推荐
相关产品推荐

