4

特定のデータをキャッシュし、それを使用して Web 要求に応答する WCF サービスがあります。この要件に対処するために、サービスをシングルトンにしました ( and を使用InstanceContextMode.SingleConcurrencyMode.Multipleます (はい、スレッドセーフです))。

次のバインディングを使用して、サービスのタイムアウトを最大に設定しようとしました。

 <binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000">
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="None" />
    </security>
 </binding>

私の問題は、サービス インスタンスが予測できない間隔で停止することです。つまり、ヒットする最初の Web 要求によってキャッシュが再構築されます (非常に遅いプロセス)。

理想的には、Web リクエストにヒットすることなく、毎日設定された時刻にキャッシュが再構築されることです。設定した時間にアプリ プールをリサイクルするように設定することもできますが、それでも最初の Web 要求までサービスがインスタンス化されないという問題は解決されません。サービスにリクエストを送信するスケジュールされた小さなスクリプトを作成する必要はありません。

WCF サービスでキャッシュを実行するためのより良い戦略はありますか? 他の人はここで何をしましたか?ベストプラクティスはありますか?

4

5 に答える 5

4

Caching Support for WCF Web HTTP Servicesに関する MSDN の記事があり、抜粋を以下に引用します。

.NET Framework バージョン 4 を使用すると、ASP.NET で既に利用可能な宣言型キャッシュ メカニズムを WCF Web HTTP サービスで使用できます。これにより、WCF Web HTTP サービス操作からの応答をキャッシュできます。キャッシュ用に構成されたサービスにユーザーが HTTP GET を送信すると、ASP.NET はキャッシュされた応答を返し、サービス メソッドは呼び出されません。キャッシュの有効期限が切れると、次にユーザーが HTTP GET を送信したときに、サービス メソッドが呼び出され、応答が再びキャッシュされます........

以下も参照してください。

于 2013-09-26T19:16:37.507 に答える
1

Web サービス内の上位層にキャッシュを実装しました。

このようにして、キャッシュを無効にするタイミングと、ディスクからデシリアライズするタイミングを決定できます。

global.asax最初の Web リクエストの前にキャッシュが構築されるようにするには、Web サーバーのロード時にキャッシュを生成するコードを追加します。

これは、「正しい方法」で行うよりもはるかに簡単です。

[OperationContract]
public void GetLargeComplexData();

public GetLargeComplexData()
{
   // deserialize last cached data from db or file
   ...

   // Verify the deserialized cache is not invalid
   ...

   // if cache is invalid rebuild
   ...

   //return cached data
   ...
}
于 2013-09-26T18:51:34.590 に答える
0

使用できるオプションは、キャッシュを WCF サービスからMemcachedなどの専用キャッシュ サービスに移動するか、 Microsoft AppFabric キャッシュを使用することです。

これにより、キャッシュされたデータのストレージを WCF サービスから分離できるため、データの管理方法とアクセス方法についてアーキテクチャの自由度が高まります。

于 2013-09-26T19:16:59.337 に答える
0

あなたreceiveTimeoutがやろうとしていることに影響を与えるつもりはありません。サービスを常に実行し続けるには、 AppFabricを使用する必要があります。そうすれば、リサイクルするたびに、AppFabric が自動的にサービスをウォームアップします。最初にアクセスしたときではなく、サービスがインスタンス化されたときにキャッシュが構築されるようにしてください。

于 2013-09-26T18:51:44.207 に答える
0

IIS7 アプリケーション ウォームアップ モジュールを使用できます

http://blogs.iis.net/thomad/archive/2009/10/14/now-available-the-iis-7-5-application-warm-up-module.aspx

于 2013-09-26T19:02:02.530 に答える