3

サードパーティの Web サービスを利用しています。Web メソッドの呼び出しにかかる時間を測定し、ネットワーク トラフィックのタイミングを計っています。ネットワーク トラフィックよりも通話にかなりの時間がかかることがわかりました。

アプリを実行し、フィドラーを使用してトラフィックを監視したところ、HTTP CONNECT トンネルを開くのに 46 ミリ秒、データを送信するのに 951 ミリ秒かかりました。この合計は約 1000 ミリ秒になると予想されますが、実際には 1504 ミリ秒になります。500 ミリ秒はそれほど多くないように思えるかもしれませんが、これはテスト サーバーから行われました。ライブ サーバーからは、1 秒かかるネットワーク コールに対して 6 秒の応答時間が定期的に見られます。

これは、Web メソッド呼び出しの時間を測定するために使用しているコードです。

  Dim service As New SupplementaryEnquiryV1PortTypeClient()

    Dim _stopWatch As New Stopwatch()

    _stopWatch.Start()

    response = service.Enquiry(request)

    _stopWatch.Stop()

クライアントは、VB .NET、Framework バージョン 4.5 で記述されています。

クライアントは、Visual Studio でサービス参照を追加することによって生成されました。また、svcutil.exe を使用してサービス参照を生成しようとしました。

Web サービスは Java で書かれていると思いますが、コードにアクセスできません。このサービスは、データベースから引き出されたと思われる 1 台の車両に関するデータを返します。

SSL を使用していないサービス エンドポイントを使用してみましたが、違いはありませんでした。

System.ServiceModel.ClientBase(Of T) の CacheSetting プロパティを AlwaysOff と AlwaysOn に設定しようとしましたが、どちらも違いはありませんでした。また、プロジェクトの「シリアル化アセンブリの生成」をオンに設定しようとしました。

traceroute を使用して、ネットワーク関連の問題をチェックしました。

フィドラーから:

CONNECT uat-wss.xxx.co.uk:443 HTTP/1.1

ClientConnected: 15:23:20.011
ClientBeginRequest: 15:23:20.027
GotRequestHeaders: 15:23:20.027
ClientDoneRequest: 15:23:20.027
Determine Gateway: 0ms
DNS Lookup: 29ms
TCP/IP Connect: 18ms
HTTPS Handshake: 20ms
ServerConnected: 15:23:20.074
FiddlerBeginRequest: 15:23:20.074
ServerGotRequest: 15:23:20.074
ServerBeginResponse: 00:00:00.000
GotResponseHeaders: 00:00:00.000
ServerDoneResponse: 00:00:00.000
ClientBeginResponse: 15:23:20.074
ClientDoneResponse: 15:23:20.074

Overall Elapsed: 0:00:00.046

POST /TradeSoap/services/SupplementaryEnquiryV1/ HTTP/1.1

ClientConnected: 15:23:20.011
ClientBeginRequest: 15:23:20.105
GotRequestHeaders: 15:23:20.105
ClientDoneRequest: 15:23:20.464
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 0ms
HTTPS Handshake: 0ms
ServerConnected: 15:23:20.074
FiddlerBeginRequest: 15:23:20.464
ServerGotRequest: 15:23:20.464
ServerBeginResponse: 15:23:20.479
GotResponseHeaders: 15:23:20.994
ServerDoneResponse: 15:23:21.041
ClientBeginResponse: 15:23:21.041
ClientDoneResponse: 15:23:21.057

Overall Elapsed: 0:00:00.951

編集

usr が提案したように、コードをプロファイラーに通しました。私は2012年に組み込みのものを使用しました(下記参照)。Microsoft.Xml.Serialization.ArrayOfObjectsSerializer1.Deserialize に多くの時間がかかっているようです。これに数秒かかる原因は何ですか?

プロフィール概要

4

2 に答える 2

2

Nagle アルゴリズムの効果を目の当たりにしているかもしれません。試してみてください。

this.webRequest.UseNagleAlgorithm.ServicePoint = false;

また、Expect100Continue の「ハンドシェイク」は、SOAP サービス呼び出しのパフォーマンスに関連しています。

this.webRequest.Expect100Continue.ServicePoint = false;

Nagle は、より少ないがより大きなデータ パケットを送信しようとするために、ネットワーク パケットの送信を短時間保留します。これを使用することは、公共のインターネットを介して通信する場合のエチケットの問題です。あなた自身の研究をしてください。

Expect100Continue は、最初の HTTP PUT/POST で SOAP 要求 XML が送信されるのを防ぎます。サーバーは OK/CONTINUE を送信し、クライアントは SOAP 要求 XML を送信します。この追加のハンドシェーク (1 回の往復で 2 回の完全な往復) も遅延を引き起こします。

于 2013-07-10T13:06:09.127 に答える