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
相关产品推荐
相关产品推荐

