生产环境出现Unexpected end of file错误,开发环境正常求排查方案
生产服务器出现"Unexpected end of file"错误,开发/本地环境正常的排查方案
错误日志
[2022-12-08T15:26:46.1761002Z] Unexpected end of file. at System.Xml.EncodingStreamWrapper.ReadBOMEncoding(Boolean notOutOfBand) at System.Xml.EncodingStreamWrapper..ctor(Stream stream, Encoding encoding) at System.Xml.XmlUTF8TextReader.SetInput(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose) at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream) at DMS.BusinessLogic.ApiHelper.Deserialize(String xml, Type toType) in d:\InmarsatSourceCode\CRMA-DMS\DMSSourceCode\Sources\DMS.BusinessLogic\DMS.BusinessLogic\APIHelper.cs:line 299
报错代码
public object Deserialize(string xml, Type toType) { using (Stream stream = new MemoryStream()) { byte[] data = System.Text.Encoding.UTF8.GetBytes(xml); stream.Write(data, 0, data.Length); stream.Position = 0; DataContractSerializer deserializer = new DataContractSerializer(toType); return deserializer.ReadObject(stream); } }
问题背景
相同代码在开发服务器、本地连接生产服务器时均运行正常,但生产服务器直接运行时触发该错误,且服务器返回500错误时UI显示上述提示。已尝试重启生产服务器、分析数据、重启IIS应用池,均无效果,怀疑与IIS或服务器依赖项有关。
排查建议
一、XML数据本身的生产环境独有问题
- 检查传入
Deserialize方法的xml参数:- 是否存在截断:生产环境可能因网络传输、负载均衡或请求大小限制,导致XML数据未完整接收
- 是否有编码/格式异常:生产数据源可能生成了不符合UTF-8规范的内容,比如未转义的控制字符、编码声明与实际编码不一致
- 临时在生产环境添加日志,记录
xml参数的长度和首尾内容,对比本地正常请求的XML数据
二、IIS配置核查
- 请求/响应限制:
- 检查站点
请求筛选中的最大允许内容长度,确认是否适配生产环境的请求数据大小 - 查看应用池
队列长度设置,是否因请求堆积导致部分请求被截断
- 检查站点
- 压缩与缓存:
- 确认是否开启
动态内容压缩,压缩异常可能导致响应数据截断 - 清空IIS缓存,排查是否存在损坏的缓存响应数据
- 确认是否开启
- 模块冲突:
- 对比开发/生产环境的IIS已安装模块,排查生产环境独有的第三方模块(如安全、监控类)是否干扰XML传输
- 临时禁用非必要模块,测试问题是否消失
- 应用池基础设置:
- 确认应用池的
.NET CLR版本、托管管道模式与开发环境完全一致,不一致的托管模式可能引发序列化行为差异 - 检查应用池身份权限,是否有权限完整读取/写入相关数据文件(若XML来自文件)
- 确认应用池的
三、服务器系统层面核查
- 网络配置:
- 检查防火墙、代理服务器规则,是否存在对请求/响应数据的截断行为
- 测试生产服务器与数据源的网络稳定性,排查丢包、延迟过高导致的数据不完整
- 系统资源:
- 检查CPU、内存、磁盘空间使用率,资源耗尽可能导致数据处理中断
- 查看系统事件日志,排查IO异常、内存溢出等相关记录
- .NET运行环境:
- 确认生产服务器的.NET框架版本与开发环境完全一致,不同版本的
DataContractSerializer可能存在行为差异 - 检查是否遗漏了.NET更新补丁,部分补丁会修复XML序列化相关Bug
- 确认生产服务器的.NET框架版本与开发环境完全一致,不同版本的
四、代码层面临时验证
- 修改
Deserialize方法,添加参数校验与日志:public object Deserialize(string xml, Type toType) { if (string.IsNullOrWhiteSpace(xml)) throw new ArgumentNullException(nameof(xml), "XML数据为空或无效"); // 临时记录XML长度,便于排查 // Logger.LogInfo($"待反序列化XML长度: {xml.Length}"); using (Stream stream = new MemoryStream()) { byte[] data = System.Text.Encoding.UTF8.GetBytes(xml); stream.Write(data, 0, data.Length); stream.Position = 0; DataContractSerializer deserializer = new DataContractSerializer(toType); return deserializer.ReadObject(stream); } } - 尝试用
XmlReader手动读取流,捕获更详细的异常信息,定位XML的具体问题位置
内容的提问来源于stack exchange,提问作者Thejasvi Theju
相关产品推荐
相关产品推荐

