2010-02-09 35 views
0

我正在使用以下代碼行來讀取異步HttpWebRequest的響應。這似乎是在特定操作中花費的最多時間。有什麼我可以在這裏優化?優化HttpWebResponse - GetResponse

System.Net.HttpWebResponse oResp =(System.Net.HttpWebResponse)oReq.EndGetResponse(oResult); 
oResp = (HttpWebResponse)oReq.GetResponse(); 
StreamReader oStreamReader = new StreamReader(oResp.GetResponseStream()); 
string sResponse = oStreamReader.ReadToEnd(); 

...繼續製作一個XmlDocument,附加一些更多的XML,然後執行XSL轉換。

創建連接:

HttpWebRequest oReq; 
oReq = (HttpWebRequest)WebRequest.Create(sUrl + sQueryString); 
oReq.ContentType = sContentType; 
oReq.Method = "POST"; 
oReq.ContentLength = aBytes.Length; 
Stream oStream = oReq.GetRequestStream(); 
oStream.Write(aBytes, 0, aBytes.Length); 
oStream.Close(); 
AsyncState oState = new AsyncState(oReq); 
return oReq.BeginGetResponse(fCallBack, oState); 
+0

爲了回答這個問題,您需要收集更多信息。延遲發生在客戶端還是服務器上?你提到你需要創建一個XML文檔 - 服務器是即時生成這個文檔還是從磁盤提供文檔? 您正在瀏覽代理? 您使用的是身份驗證嗎? 你使用Tcp保持連接嗎?與此相關的是,這個請求是在一個循環中完成的,還是這是一個一次性的應用程序,只是這個請求並結束? 顯示您如何創建請求的代碼片段。 我們可以從那裏進一步... – feroze 2010-02-10 00:05:53

+0

此外,爲什麼你再次調用EndGetResponse()然後GetResponse()?這不正確的使用API​​。 – feroze 2010-02-10 02:10:24

+0

一些更多信息: 服務器正在生成xml。 我不使用代理服務器。 通話已通過身份驗證。 連接不會保持活動狀態。 這些連接是一次性的,每個負載不會有超過一次的連接。 我已經在上面添加了如何創建請求。 – aepheus 2010-02-15 19:50:50

回答

0

我發現了一個重大的改進,我用的方案。而不是使用StreamReader和ReadToEnd將Stream轉換爲字符串,然後纔將其轉換爲XmlDocument。我跳過了中間人,並直接將Stream轉換爲XmlDocument。

這給我留下了另一個問題,但是我不得不改變XmlDocument的父類以適合我的Xslt(這裏有很多很多,他們都期待着我的結構)。對於該修復,請參閱How can I add new root element to a C# XmlDocument?

這給了我大約2/3的處理web服務調用結果的時間減少,並且使用的內存量大大減少。在以前的版本中,響應xml在內存中有兩個不同的時間(如果流數量可能是三個)!

此外,刪除額外的GetResponse似乎有所幫助。

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult)) 
{ 
oXml.Load(oResp.GetResponseStream()); 
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement); 
oXml.LoadXml(sOtherXml); 
oXml.DocumentElement.AppendChild(oApiResult); 
}