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

Windows Service调用SOAP服务遇错误码时无法读取响应的问题

解决方案

出现System.ObjectDisposedException的核心原因是未正确管理WebResponse及响应流的生命周期,且手动读取流的方式存在风险(比如依赖不支持获取长度的流)。以下是正确的处理方式:

关键修复点

  • 用using语句自动管理WebResponse和Stream的释放,避免资源被提前回收
  • 避免直接依赖stream.Length(部分网络流不支持此属性),改用StreamReader直接读取完整响应内容
  • 确保读取流的操作在资源释放前完成

修改后的代码示例

Plate[] plates = new Plate[1];
Plate plate = new Plate();
plate.BranchCenterCode = 1315;
plate.PlateNumber = "423";
plate.Quantity = 2;
plate.RegType = 384;
plate.SizeType = 2;
plates[0] = plate;

try
{
    webService.ImportOrder(plates);
}
catch (WebException error)
{
    if (error.Status == WebExceptionStatus.ProtocolError)
    { 
        // 使用using自动释放WebResponse资源
        using (WebResponse response = error.Response)
        {
            // 使用using自动释放Stream资源
            using (Stream stream = response.GetResponseStream())
            {
                // 用StreamReader直接读取完整响应内容
                using (StreamReader reader = new StreamReader(stream))
                {
                    string responseContent = reader.ReadToEnd();
                    // 此处可处理响应内容,比如解析XML
                    Console.WriteLine(responseContent);
                }
            }
        }
    }
}

额外说明

  • SOAP服务返回非200状态码时,.NET的WebReference代理会自动抛出WebException,但响应流仍可读取,前提是必须在资源被释放前完成读取
  • 手动分块读取流容易出错,StreamReader.ReadToEnd()是更可靠的方式,它会自动处理流的所有内容,无需关心长度

内容的提问来源于stack exchange,提问作者Bartosz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:14:56