2011-12-05 81 views
1

我正在使用POST調用Web服務並收到2MB xml。 問題是,我需要很長時間才能使用Stream中的數據。 響應似乎是在7秒之後,但從響應流中讀取內容(其字符串)需要10秒。以毫秒爲單位HttpWebRequest在c#中的Web服務;如何從響應流中獲取FAST數據?

Talking to Web-Service: 6595 
"Convert" stream to some useful data: 10772 

Stopwatch s = new Stopwatch(); 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(MyUri); 
req.Method = "POST"; 

req.ContentType = "application/x-www-form-urlencoded"; 
req.ContentLength = Poststring.Length; 
s.Start(); 
StreamWriter swriter = new StreamWriter(req.GetRequestStream()); 
swriter.Write(Poststring); 
swriter.Close(); 

// Get the response. 7 sec 
HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
s.Stop(); 
Debug.WriteLine("Talking to Web-Service: "+s.ElapsedMilliseconds); 

s.Reset(); 
// Get the stream containing content returned by the server. 
Stream dataStream = response.GetResponseStream(); 
// Open the stream using a StreamReader for easy access. 
StreamReader reader = new StreamReader(dataStream); 

// Read the content. 10 sec 
XmlReader xmlReader = XmlReader.Create(dataStream); 
s.Start(); 
XDocument xdoc = XDocument.Load(xmlReader); 
s.Stop(); 
Debug.WriteLine("Convert stream to some useful data: "+s.ElapsedMilliseconds); 

輸出爲何要像10秒閱讀的內容? 在讀取內容時是否存在與Web服務的一些通信或等待數據?它只是一個簡單的文本文件(xml),大約2MB。我認爲這些2 MB在6596毫秒內被轉移。因爲當我用我的瀏覽器調用該服務時,xml內容顯示在6-7秒內。

與網絡服務交談的時間可以,但在10772毫秒內發生了什麼?

編輯:問題是stil那裏。我得到不同的答案,他們相互矛盾彼此。

+0

這是什麼樣的服務? ASMX或WCF? –

+0

該服務的端點配置是什麼?什麼綁定? – Amy

+0

這就是問題所在。我不知道細節。它完成與Django的python和我發送key = value(Poststring)對。 swriter.Write(Poststring); – Gero

回答

1

添加以下

httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 
httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

導致取決於課程:

Talking to Web-Service: 6595 
"Convert" stream to some useful data: 256 

現在我在瀏覽器中具有相同的性能!

0
XDocument xdoc = XDocument.Load(response.GetResponseStream(), LoadOptions.None); 

避免XmlReader.Create並使用XDocument.Load(Stream,LoadOptions)重載。 http://msdn.microsoft.com/en-us/library/cc838321.aspx

+0

thx,我已經嘗試過,但它是同樣的事情。你需要.net 4.0 – Gero

+1

@Gero - 嘗試使用WebClient.DownloadString和XDocument.Parse,這可能會繞過XDocument.Load –

0

GetResponse不會返回完整的響應流。 GetResponse將根據響應中的標題信息發送您的請求並返回HttpWebResponse對象。 HttpWebResponse也有一個關聯的流,您可以從中閱讀完整的響應主體。這正是你正在做的。

我懷疑當您撥打GetResponse時,您看到的7秒延遲是服務器在生成XML文檔和發送響應時的延遲。 XmlReader.Create的延遲10秒延遲來自讀取響應流(即下載文件)。

動態生成XML嗎? 7秒是不是一個非常長的時間HTTP響應,您的服務器的位置,質量等

+0

的單數放緩,你對第一段的看法是正確的。但是,當我從一個網站對Web服務執行相同的查詢時,使用也作爲HTTP POST發佈的接口,它僅需要7秒,並且瀏覽器在窗口中顯示xml文件(內容)。 – Gero

+0

嗯,這非常有趣。我現在也很困惑:P –

+0

我認爲'GetResponse'可以獲取所有數據。 「gzip,deflate」的缺失是問題所在。 – Gero

相關問題