2012-03-16 22 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++; 
    } 
} 

EDIT:これは私が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は、(1〜2)SOAPよりも優れていますが、ラージオブジェクト(大きな画像バイト配列を持つオブジェクト)にSOAPがはるかに高速です:小さなオブジェクトの

、例えば:私はさらにいくつかのテストをしました。

もう1つの奇妙なことは、私がRESTループのvar test = (Test)dcs.ReadObject(stream);行をコメントアウトすると、実際にパフォーマンスが低下することです。

+3

"C#"などをタイトルの末尾に追加しないでください。それがタグのためのものです。 –

+0

私が知る限り、あなたは異なる 'WebRequests'を使うことができ、彼らは同じ接続を再利用しようとします。あなたは実際には起こらないと確信しています、そして、サーバは 'Keep-Alive'をサポートしていますか? – svick

+0

'GetResponse'と' GetResponseStream'は 'IDisposable'を実装しているので' using(){...} 'ブロックに囲みます。 –

答えて

0

新しい応答を開く前に、最初の応答を閉じます。 GetXYZ()usingの文章の中に入れてください。 KeepAliveはデフォルトでtrueです。

+0

私が上で言ったように:これはスケルトンです、それは働くコードとして意味されません。私はstream.Close()とResponse.Close()を追加しました。パフォーマンスは優れていますが、SOAPベースのサービスを使用する同様のループよりもはるかに低速です。 – user472875

+0

私が理解すれば、上記のコードはうまく機能しますが、パフォーマンスは期待通りではありませんか?両方のケースでパフォーマンスをテストするために使用する完全なコードを投稿できますか? –