问题排查 - DotNet 6 后台服务Docker部署后部分接口返回值乱码

问题描述

最近有一个DotNetWebApi服务需要使用Docker在服务器部署,部署后部分接口返回内容会出现部分乱码的情况。
193c432f405984ebe95ec31c0132f76.png
一些关键点:

  • 服务本机直接启动,此接口无异常;
  • 服务器直接启动,此接口无异常
    • 服务器为Ubuntu20.04
    • 安装了DotNet运行时
    • 启动方式为dotnet run
  • 打包镜像后在服务器启动容器出现上述异常;
    • 其它接口中文返回正常
    • 出现异常的接口返回体中,仅部分字段内容为中文时异常,有些字段中文显示正常
  • 异常字段通过Description注解获取其中文描述值

问题原因

使用VSCode打开出现问题的枚举类的CS文件,查看编码!文件编码为“GB2312”!其它正常文件编码为UTF8(with bom)!
改变此枚举类文件为UTF8(with bom)重新部署即可解决问题!

关于代码文件编码为GB2312时反射获取值乱码的一些疑问

  • 为什么Description特性属性值获取到乱码?
  • 为什么本机部署以及在服务器直接启动却没有问题?

获取枚举字段描述特性属性值的方法

/// <summary>
/// Get the description of the "Description" attribute on enum object.
/// </summary>
/// <param name="enum"></param>
/// <returns></returns>
public static string GetDescription(this Enum @enum)
{
    var field = @enum.GetType().GetField(@enum.ToString());
    var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
    return customAttribute == null ? @enum.ToString() : ((DescriptionAttribute)customAttribute).Description;
}

个人推测:
本机Windows以及服务器上已经安装了中文文字环境,所以GB2312的对应出问题的CS代码文件通过反射拿到的描述属性内容没有问题。

posted @ 2023-01-06 16:06  billy_gisboy  阅读(30)  评论(0编辑  收藏  举报  来源