Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF Web服务结束时保存缓存对象_C#_Wcf_Web Services - Fatal编程技术网

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

C# 在WCF Web服务结束时保存缓存对象,c#,wcf,web-services,C#,Wcf,Web Services,我有一个简单的WCF Web服务,它有两种方法:一种是在缓存中保存/更新对象,另一种是删除对象。关闭webservice服务器时如何保存对象 使用CacheItemRemovedCallback不起作用,因为每次更新对象时都会将其删除。 使用Global.asax.cs.Application\u End()也不起作用,因为缓存在到达时已被清除。 使用Dispose() [ServiceContract] public class WebService { [OperationContr

我有一个简单的WCF Web服务,它有两种方法:一种是在缓存中保存/更新对象,另一种是删除对象。关闭webservice服务器时如何保存对象

使用
CacheItemRemovedCallback
不起作用,因为每次更新对象时都会将其删除。 使用
Global.asax.cs.Application\u 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");
            });
        }
    }
}
[服务合同]
公共类Web服务
{
[经营合同]
公共无效测试(字符串消息)
{
列出日志;
Logs=HttpRuntime.Cache.Get(“LogMessages”)作为列表;
if(Logs==null)
{
日志=新列表();
日志。添加(消息);
}
else日志。添加(消息);
HttpRuntime.Cache.Insert(“LogMessages”,Logs,null,Cache.noabsoluteexpntiation,Cache.NoSlidingExpiration,cacheitepriority.NotRemovable,null);
}
[经营合同]
public void WriteToFile()
{
列出日志;
Logs=HttpRuntime.Cache.Get(“LogMessages”)作为列表;
if(Logs==null)
{
字符串文件名=DateTime.Now.ToString(“yyyy_MM_dd_HH_MM_ss_fff”);
System.Threading.Tasks.Task.Factory.StartNew(()=>
{
//将对象写入磁盘的任何方法
HttpRuntime.Cache.Remove(“LogMessages”);
});
}
}
}

一般来说,如果您需要在WCF服务启动或停止时执行某些操作,则应该由管理员完成

选中
OnClose
OnClose
事件以执行所需操作

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扩展性的更多信息,请参阅