2013-08-23 63 views
0

我有一個簡單的WCF webservice有兩個方法:一個保存/更新緩存中的obect,另一個刪除它。如何關閉Web服務服務器時保存對象。當WCF webservice結束時保存緩存對象

使用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"); 
      }); 
     } 
    } 
} 

回答

0

一般來說,如果你需要做的事情時,WCF服務啓動或停止,應通過extending the ServiceHostFactory完成。

檢查ServiceHostOnCloseOnClosing事件來做你的需要。

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(); 
    } 
} 

您也可以實現自己的instance provider並使用ReleaseInstance方法。

public class MyInstanceProviderBehavior : IInstanceProvider 
{ 

    ... 

    #region IInstanceProvider Members  

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

    #endregion 
} 

有關WCF可擴展性的更多信息,請參閱Carlos Figueira blog