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

.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:
    echo $LANG  # 应输出类似 "fa_IR.UTF-8" 或 "en_US.UTF-8"
    
    若shell编码非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:30