0

2 つのメソッドを持つ単純な WCF Web サービスがあります。1 つはオブジェクトをキャッシュに保存/更新し、もう 1 つはそれを削除します。Web サービス サーバーを閉じるときにオブジェクトを保存するにはどうすればよいですか。

更新するたびにオブジェクトが削除されるため、使用CacheItemRemovedCallbackできません。ここに来るまでにキャッシュがクリアされるため、使用Global.asax.cs.Application_End()も機能しません。Dispose()呼び出しが終了するたびに呼び出されるため、メソッド メソッドの使用は機能しません。

[ServiceContract]
public class WebService
{
    [OperationContract]
    public void Test(string message)
    {
        List<string> Logs;

        Logs = HttpRuntime.Cache.Get("LogMessages") as List<string>;
        if (Logs == null)
        {
            Logs = new List<string>();
            Logs.Add(message);
        }
        else Logs.Add(message);

        HttpRuntime.Cache.Insert("LogMessages", Logs, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);
    }

    [OperationContract]
    public void WriteToFile()
    {
        List<string> Logs;

        Logs = HttpRuntime.Cache.Get("LogMessages") as List<string>;
        if (Logs == null)
        {
            string filename = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff");
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                //any method of writing the object to disk
                HttpRuntime.Cache.Remove("LogMessages");
            });
        }
    }
}
4

1 に答える 1

0

一般に、WCF サービスの開始または停止時に何かを行う必要がある場合はServiceHostFactory .

チェックまたはイベントを実行して、必要なことを行います。ServiceHost OnCloseOnClosing

public class DerivedHost : ServiceHost
{
   public DerivedHost( Type t, params Uri baseAddresses ) :
      base( t, baseAddresses ) {}

   protected override void OnClose(System.TimeSpan timeout)
   {
       ...

       base.OnClose(timeout);
   }

   protected override void OnClosing()
   {
       ...

       base.OnClosing();
   }
}

独自のインスタンス プロバイダーを実装して、メソッドを使用することもできますReleaseInstance

public class MyInstanceProviderBehavior : IInstanceProvider
{

  ...

  #region IInstanceProvider Members    

  public void ReleaseInstance(InstanceContext instanceContext, object instance)
  {
     ...
  }

  #endregion
}

WCF の拡張性について詳しくは、カルロス フィゲイラのブログを参照してください。

于 2013-08-23T15:51:32.323 に答える