2

Azureのインスタンスで実行されているBasicHttpBindingを使用する2つのエンドポイントを持つWCFサービスがあります。サービスが初めて呼び出されたとき、応答には13〜16秒かかり(予想される)、その後の要求は、要求の種類に応じて150ミリ秒から1000ミリ秒の間で適切です(テストにはsoapUIを使用しています)。

しかし、数分間4分または5分未満)リクエストを送信しない場合、サービスインスタンスは、最初のリクエストである13秒以上かかるため、再利用されていないように見えます。

ServiceBehaviorで「InstanceContextMode=InstanceContextMode.Single」を試しましたが、問題は解決しませんでした。

トレースでは、サービスが遅い応答を返すたびにスレッドIDが変化することがわかります。

また、Application_BeginRequestがヒットしてから、クライアントによって呼び出されているメソッドが開始されるまでの時間を記録しました。これは、これらの「遅い」呼び出し中の最大の遅延のようです。ビジネスインターフェイスを表すかなり大きなクラスがいくつかあり、AzureVMで実行されているMySQLデータベースにEntityFrameworkを使用しています。(これは必ずしもAzureの問題ではないと思いますが)。

遅い応答は、DB操作にリンクされた複雑なメッセージタイプを呼び出している場合でも、単純な「HelloWorld」応答を呼び出している場合でも同じです。

  • サービスの新しいインスタンスが必要な場合でも、IISの再起動またはアプリケーションプールのリサイクル後の初期ロードと同じくらいの時間がかかりますか?

  • 静的クラスのラッパーを使用して魔法をかけることは役に立ちますか?(私は考えていません)。

C#4.0 /VS2010Professionalで構築

4

1 に答える 1

2

これが起こっている理由はたくさんあります。WCF サービスでトレースを開始することをお勧めします。

  • TraceSourceを使用してアプリケーションにログを追加します。

    private TraceSource ts = new TraceSource("MyApp");
    
    public string GetData(int value)
    {
        ts.TraceInformation("GetData called with {0}", value);
    
        return string.Format("You entered: {0}", value);
    }
    
  • System.ServiceModel ソースと共に web.config で TraceSource を構成します。


 <system.diagnostics>
    <sources>
      <source name="MyApp" switchValue="All">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="All" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="Logs.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="xml" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

  • svclog ファイルを開くと、サービスで起こっているすべてのことの詳細な概要と、各小さなステップにかかる時間を確認できます。これは、問題を指摘するのに役立ちます。

ここに画像の説明を入力

于 2012-09-06T14:44:41.917 に答える