ASP.NET Core 3.1 - IIS 服务器上带有重音字符问题的字符串后面的代码

Posted

技术标签:

【中文标题】ASP.NET Core 3.1 - IIS 服务器上带有重音字符问题的字符串后面的代码【英文标题】:ASP.NET Core 3.1 - Code behind string with accent character issue on IIS server 【发布时间】:2021-02-05 20:20:51 【问题描述】:

我在 .NET Core 3.1 的剃刀页面后面的代码中包含重音字符的字符串有一个奇怪的问题。

当我在 VS2019 或本地 IIS 中运行代码时,一切正常,字符串显示并使用“é”和“ô”等字符注入 SQL 中。但是,一旦我们在开发 IIS 上迁移代码,重音字符就会更改为无法识别的字符“�”,而重音字符应该是。对于这 3 种情况,我使用相同的数据库。

cshtml 页面使用的是 UTF-8 编码,但我怀疑它是否重要,因为据我了解,问题出在后面的代码中......

假设我有一些函数 OnPost:

public IActionResult OnPostChangeValue(int objectKey, string newvalue)

     someInterface.someFunction($"Rôle de déploiement: newvalue");

     return Page();

当一个按钮被点击时,新值来自剃刀页面,一个带有一些值的字符串被发布。该按钮是表单内表格的一部分,使用 ajax 构建数据表。

<button type="submit" class="btn btn-danger" formaction="./Page?objectKey=' + row.objectKey + '&newvalue=SomeText&handler=ChangeValue">SomeText</button>

然后在接口实现代码中,我添加了一个记录器来获取 SQL 注入之前的值,以验证问题是与 SQL 还是代码本身有关。注意:此类驻留在默认项目引用的另一个项目/dll 中。

public someFunction(string message)

    ILogger.logWarning(message);

    using (IDbConnection connection = new SqlConnection(config.GetConnectionString("someDbString")))
            
                connection.Execute("dbo.someStoredProcedure @Message", new Message = message);
            

当代码在开发服务器/IIS上运行时,入口为“R�le de d�ploiement: ...”。但是,如果从 Visual Studio 或我的本地 IIS(发布发布)运行相同的代码/构建,则该条目如预期的那样是“Rôle de déploiement: ...”。

我的问题是:我该如何解决这个问题和/或 IIS/Windows 服务器上是否有一个设置可以防止在后面的代码中使用重音字符?

谢谢!

编辑:添加更多信息

EDIT2:我已经能够在我的本地 IIS 上重现该问题。 我们正在使用 Azure DevOps 在我们的 IIS 服务器上构建和发布 webapp。我已经下载了 Azure Build(我认为它与我在本地使用 VS2019 获得的相同),现在我遇到了问题。所以它似乎是由使用 Azure DevOps 构建时发现的东西引起的......

【问题讨论】:

我认为控制台设置为 ascii ... 使用它来正确“查看”: Console.OutputEncoding = System.Text.Encoding.UTF8;设置后字符是否显示在记录器中?还有这些字符的来源是什么?从文件导入? @pcalkins 我尝试按照我的代码之前的建议添加 Console.OutputEncoding = System.Text.Encoding.UTF8 但结果仍然相同,重音在 sql 数据库中被替换为� 事件日志。 newvalue 的来源来自 cshtml 网页,但字符串中的重音在 cs 文件中的函数中被硬编码。谢谢! 该视图可能会产生误导......这只是意味着它没有 unicode 值的字符。要对此进行调试,您需要查看正在传递的 unicode 值。检查此页面:docs.microsoft.com/en-us/dotnet/standard/base-types/…(“如果您的应用程序具有非严格 ASCII 的内容并使用 ASCIIEncoding 对其进行编码,则每个非 ASCII 字符编码为问号 (?)。如果应用程序随后解码此数据,则信息为丢了。”) 【参考方案1】:

问题出在 Azure DevOps 中,管道用于构建发布的代理。

我变了:

vmImage: 'ubuntu-latest'

收件人:

vmImage: 'windows-2019'

在管道配置中,现在代码按预期编译,字符串中带有重音符号。我可能可以改用“windows-latest”,但现在已经解决了。

【讨论】:

以上是关于ASP.NET Core 3.1 - IIS 服务器上带有重音字符问题的字符串后面的代码的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core--.net core 3.1 部署到 IIS

HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)

仅在 IIS 中发布时,在 ASP.net Core 3.1 WebAPI 中启用 CORS 时出错

PUT 请求抛出 403 CORS 错误 Asp.Net Core 3.1 + Vue3 +IIS10

ASP.NET Core 3.1 图像 URL 错误代码 302 重定向

总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)