WCF Web服务结束时保存缓存对象

本文关键字:保存 缓存 对象 结束 Web 服务 WCF | 更新日期: 2023-09-27 18:28:43

我有一个简单的WCF Web服务,有两个方法:一个保存/更新缓存中的obect,另一个删除它。关闭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");
            });
        }
    }
}

WCF Web服务结束时保存缓存对象

通常,如果您需要在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可扩展性的更多信息,请查看Carlos Figueira博客。