8

WCFサーバークライアントアプリケーションを作成しています。ただし、私の最初のテストでは、単純な呼び出し(基本的にはメソッドreturn true;)に多くの時間がかかります(約5秒)

私はそれをトレースしようとしました、そしてこれはコールトレースのスクリーンショットです ここに画像の説明を入力してください

2行目と3行目の間でわかるように、5秒経過しています(正直なところ、2行目と3行目が何を意味するのかわかりません)。

クライアント(呼び出し元)の構成では、バインディングは次のようになります(主にVisual Studioによって生成されます)

    <wsHttpBinding>
        <binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="None">
          </security>
        </binding>
      </wsHttpBinding>

そしてサーバーで

<wsHttpBinding>
    <binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:05:00" sendTimeout="00:05:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="16777216" maxReceivedMessageSize="16777216"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="16777216"
        maxArrayLength="16384" maxBytesPerRead="16384" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="None"/>
    </binding>

そして、私がそれをこのように呼ぶ方法

var client = new AgentClient(binding, BuildEndpointAddress(hostName, port));
for(int i =0; i<10; i++)
    client.IsAlive(); //this call is very slow despite just returning true;
    // subsequent calls are also slow so probably not because of wake-up time

このテストでは、サーバーとクライアントの両方が同じコンピューターにあるため、ネットワークの問題になることはありません。速度低下の原因や、これをトラブルシューティングするための詳細情報を見つける方法について何か考えはありますか?

4

3 に答える 3

1

アプリケーションの有効期間は投稿で指定されていません。クライアントアプリを起動し、ウォームアップせずに最初にWCFサービスを呼び出すことを前提としています。

その場合、タイミングは理にかなっています。

.NETは、軽量のバインディングとメッセージを使用しているにもかかわらずウォームアップされていない場合、ChannelFactoryとServerを初期化するために多くの隠された作業を行います。

これはWCFの性質であり、ウォームアップ後の通信は非常に高速であるため、多くの問題を引き起こすことはありません。

両方の呼び出しの時間を測定する1つのアプリセッションで、サービスを2回続けて呼び出すようにしてください。両方の呼び出しに同等の時間がかかる場合、私の仮定は間違っています。

私の質問を見て環境を比較したい場合-

最初のWCFクライアント呼び出しが遅いのはなぜですか?

于 2012-06-05T02:12:02.107 に答える
0

WCF トレース ログを構成してみてください - 詳細はこちら: http://msdn.microsoft.com/en-us/library/ms733025.aspx

私は WCF であらゆる種類の抜け毛の問題を経験してきましたが、同じボックスでのその種のパフォーマンスの問題は、これまで見たことがないものです。他の人が言ったように、最も可能性の高い原因はサーバーの「ウォームアップ」ですが、何度か呼び出している場合、これは問題になりません。クライアント アプリ内からコードを複数回呼び出してみましたか?

于 2012-06-18T07:33:21.677 に答える
0

詳細を確認するには、BCL チームの codeplex サイトのPerfmonitorツールを使用して Event Tracing for Windows (ETW) を活用することをお勧めします。このツールの多くの機能の 1 つは、ミリ秒ごとに命令ポインターをサンプリングし、各サンプルのマネージ コール スタックを提供できることです。これにより、これらの時間の経過中にコードが何をしているかがわかります。

ps。このツールを使用する記事への別のリンク: http://naveensrinivasan.com/category/net/etw-net/

于 2012-06-04T14:41:32.380 に答える