2009-12-11 95 views
1

問候,全部。這是我的情況。我正在嘗試向本地處理程序文件發出HttpWebRequest,並且我一直收到以下異常:將HttpWebRequest設置爲本地ASHX文件時發生IOException

無法從傳輸連接讀取數據:現有連接被遠程主機強制關閉。

現在,我正在使用本地處理程序文件,因爲我正在爲該網站將要使用的第三方編寫一些集成代碼。直到我有一個測試環境可供我請求時,我基本上是用本地處理程序文件來嘲弄這個過程。這是相關的代碼。謝謝。

的WebRequest代碼(子請求變量是傳遞給執行該代碼的方法對象):

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

大聲笑!就這樣,只要我發佈這個問題,我就收到了我一直在等待的測試環境的連接細節。那很好笑。如果這個問題再次出現,我們仍然會對這個問題的答案或建議感到欣慰。 :) – 2009-12-11 18:16:36

回答

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

並查看是否可以解決您的問題。

相關問題