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

在Ubuntu服务器上用Docker部署的DotNetWebApi服务遇到部分接口返回内容乱码的问题,原因在于一个枚举类的CS文件编码为GB2312而非UTF8。当切换该文件编码至UTF8并重新部署后,问题得到解决。本地和服务器直接启动无异常可能是因为已配置中文环境。问题关键在于反射获取Description特性值时因编码不一致导致乱码。
摘要由CSDN通过智能技术生成

问题描述

最近有一个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代码文件通过反射拿到的描述属性内容没有问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值