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

生产环境出现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

四、代码层面临时验证

  • 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:40:32