将HttpWebRequest发送到本地ASHX文件时发生IOException

时间:2009-12-11 18:10:16

标签: httpwebrequest localhost handler ashx

问候,所有。这是我的情况。我试图将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()));

抛出异常的时间。有任何想法吗?提前谢谢。

詹姆斯

1 个答案:

答案 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);

并查看是否可以解决您的问题。