2012-03-16 42 views
0

我正在嘗試向REST Web服務發出多個相同的請求。我遇到的問題是,對於每個請求,似乎都會打開一個新套接字,這使得操作更慢(〜x10)太多。 (與使用SOAP代理通道的相同操作相比)。多個相同的Web請求

我已經查看了HttpWebRequest.KeepAlive,但我無法多次調用同一個Web請求上的GetResponse()。

下面這段代碼是什麼,我需要的想法,是的,我知道這將無法工作,因爲的原因,我在上面提到:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serviceUri); 
req.KeepAlive = true; 

var dcs = new DataContractSerializer(typeof(Test)); 

while (enabled) 
{ 
    var stream = req.GetResponse().GetResponseStream();     

    if (stream != null) 
    { 
     var test = (Test)dcs.ReadObject(stream); 
     counter++; 
    } 
} 

編輯:這是我使用的SOAP循環測試:

private void SoapLoop() 
{ 
    IService1 proxy = 
     ChannelFactory<IService1>.CreateChannel(
      tcpBinding, endpointAddress); 



    while (enabled) 
    { 
     var test = proxy.GetRead(new GetReadRequest()); 
     counter++; 
    } 

} 

我轉移的對象在SOAP和REST中都是一樣的,大約是300KB。

EDIT2:我做了一些進一步的測試:

上的小物件,例如:100個字節REST優於SOAP(〜2:1),但在大的對象(具有大的圖像字節數組對象)SOAP快得多。

另一個奇怪的是,當我在REST循環中註釋掉行var test = (Test)dcs.ReadObject(stream);時,性能實際上下降了:S。

+3

請不要將「C#」等添加到標題的末尾。這就是標籤的用途。 – 2012-03-16 16:34:21

+0

據我所知,你可以使用不同的'WebRequests',他們會嘗試重用相同的連接。你確定實際上並沒有發生,並且服務器確實支持'Keep-Alive'嗎? – svick 2012-03-16 16:36:48

+0

將你的'GetResponse'和'GetResponseStream'包裝成'using(){...}'塊,因爲它們實現了'IDisposable'。 – 2012-03-16 16:40:54

回答

0

在打開新的響應之前關閉第一個響應。請考慮將GetXYZ()置於using聲明中。 KeepAlive默認爲true

+0

正如我上面所說:這是Skeleton,它不是工作代碼。我添加了stream.Close()和Response.Close()。性能較好,但仍比使用基於SOAP的服務的類似循環慢得多。 – user472875 2012-03-16 16:47:28

+0

所以,如果我明白,現在上面的代碼工作,但性能不是你所期望的?你能在這兩種情況下發布你用來測試表演的完整代碼嗎? – 2012-03-16 16:58:24