8

SoapHttpClientProtocolを継承して、VS2008 .Net 3.5で生成された従来のC#Webサービスクライアントを使用しています。これは、Javaで記述されたリモートWebサービスに接続しています。

すべての構成はクライアントの初期化中にコードで行われ、以下で確認できます。

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 10;

        var client = new APIService
        {
            EnableDecompression = true,
            Url = _url + "?guid=" + Guid.NewGuid(),
            Credentials = new NetworkCredential(user, password, null),
            PreAuthenticate = true,
            Timeout = 5000 // 5 sec
        };

すべて正常に機能しますが、最も単純なメソッド呼び出しの実行にかかる時間は、ネットワークのping時間のほぼ2倍です。Javaテストクライアントはネットワークのping時間とほぼ同じですが、次のようになります。

C# client ~ 550ms
Java client ~ 340ms
Network ping ~ 300ms

セッションのTCPトラフィックを分析した後、次のことがわかりました。

基本的に、C#クライアントは次の順序でTCPパケットを送信しました。

Client Send HTTP Headers in one packet.
Client Waits For TCP ACK from server.
Client Sends HTTP Body in one packet.
Client Waits For TCP ACK from server.

Javaクライアントは、次の順序でTCPパケットを送信しました。

Client Sends HTTP Headers in one packet.
Client Sends HTTP Body in one packet.
Client Revieves ACK for first packet.
Client Revieves ACK for second packet.
Client Revieves ACK for second packet.

Javaクライアントのようにヘッダー/本文を並列に送信するようにC#Webサービスクライアントを構成する方法はありますか?

どんな助けやポインタも大歓迎です。

4

2 に答える 2

1

Robの返信に感謝し、最終的にはAdd Service Reference/WCFプロキシ生成を使用することを選択しました。これはデフォルトでこれを行います。おそらく、その下で新しいHTTPライブラリを使用しているためです。

複雑なオブジェクトの生の配列を返すSOAPメソッドでいくつかのWCFプロキシ生成の問題がありました(つまり、オブジェクトの配列を含むオブジェクトを返すことは正常に機能しました)。これを回避するには、配列をオブジェクトでラップするか、SOAPサーバー構成をRPCからDOCUMENTに切り替える必要があります(これは私たちが行ったことです)。

于 2010-04-29T09:04:47.393 に答える
0

継承されたEndGetRequestStreamメソッドを使用して、SoapHttpClientProtocol をハッキングできると思います。リクエストが完了するまで、それをバッファに保存します。次に、独自のストリームを作成し、すべてを一度にプッシュします。

于 2010-04-28T05:02:53.643 に答える