我有一个简单的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");
});
}
}
}
答案 0 :(得分:0)
通常,如果您需要在WCF服务启动或停止时执行某些操作,则应由extending the ServiceHostFactory
完成。
检查ServiceHost
OnClose
或OnClosing
事件,以满足您的需求。
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。