1

大家好。这是我的情况。我正在尝试向本地处理程序文件发出 HttpWebRequest,但我不断收到以下异常:

无法从传输连接读取数据:现有连接被远程主机强行关闭。

现在,我正在使用本地处理程序文件,因为我正在为站点将使用的第三方编写一些集成代码。在我有一个可供我提出请求的测试环境之前,我基本上是在使用本地处理程序文件模拟该过程。这是相关的代码。谢谢。

WebRequest 代码(subRequest 变量是传递给执行此代码的方法的对象):

XmlSerializer serializer;
XmlDocument xmlDoc = null;

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(requestUrl);
webRequest.Method = "POST";
webRequest.ContentType = "text/xml";
webRequest.KeepAlive = true;
webRequest.Accept = "*/*";

serializer = new XmlSerializer(subRequest.GetType());
XmlWriter writer = new XmlTextWriter(webRequest.GetRequestStream(), Encoding.UTF8);
serializer.Serialize(writer, subRequest);
writer.Close();

xmlDoc = new XmlDocument();
xmlDoc.Load(XmlReader.Create(webRequest.GetResponse().GetResponseStream()));

“requestUrl”被定义为“ http://localhost:2718/Handlers/MyHandler.ashx ”。我可以很好地点击处理程序文件并单步执行代码。它所做的只是将 XML 响应组装为字符串并将其写入 Response 对象:

context.Response.ContentType = "text/xml";
string newSubscriptionId = Utils.GetUniqueKey();

StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
// Assemble XML string here

context.Response.Write(sb.ToString());

据我所知,这一切都很好。但是当我的代码到达 WebRequest 块的最后一行时:

xmlDoc.Load(XmlReader.Create(webRequest.GetResponse().GetResponseStream()));

是什么时候抛出异常。有任何想法吗?提前致谢。

詹姆士

4

1 回答 1

0

首先,如果您不打算重用连接,或者不会对同一架构/服务器/端口发出另一个请求,我会将 KeepAlive 设置为 false。

问题是XmlDocument.Load()在服务器关闭连接之前没有读取整个流,或者它一直读取到结束并且当服务器保持活动超时结束时,连接被服务器关闭。此外,您永远不会关闭响应流。要验证该理论是否正确,请执行以下操作:

// Optional -> webRequest.KeepAlive = false;
string xml = null;
using (StreamReader reader = new StreamReader (webRequest.GetResponse().GetResponseStream())) {
    xml = reader.ReadToEnd ();
}
xmlDoc.LoadXml (xml);

看看是否能解决你的问题。

于 2009-12-15T05:16:24.517 回答