问候,所有。这是我的情况。我试图将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()));
抛出异常的时间。有任何想法吗?提前谢谢。
詹姆斯
答案 0 :(得分: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);
并查看是否可以解决您的问题。