保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它

Posted

技术标签:

【中文标题】保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它【英文标题】:Save List created in WCF service so as to view it when the service restarts 【发布时间】:2012-04-26 16:34:29 【问题描述】:

我有一个 WCF 服务,我想在其中保存一个在服务运行时创建的 XML 列表,以便在服务关闭后保存,即在重新启动服务时查看它。调用 HTTP POST 时会将项目添加到列表中。但是,在重新启动服务后调用返回列表项的程序中的 HTTP GET 方法时,它不会显示列表项,因为它们没有保存。我与此问题相关的问题是:

1) 如何保存列表以供将来参考? 2) 是否有某种机制可以在每次服务关闭时保存此列表,以便在重新启动服务时查看?

再多一个指针: 我不希望将列表项保存为本地计算机上的 xml 文件!

【问题讨论】:

看看在主机的 OnClosing 事件中实现自定义服务主机并将列表保存到文件(在服务器上)。或者,您可以将其保存在数据库中。然后在主机的 OnOpening 中,你可以从 db 中读取文件或数据。 【参考方案1】:

Tim 的建议是合理的,但是您不需要自定义服务主机来执行此操作。主要是将数据内容写入持久存储,在更新后的某个时间点。当您收到 POST 时,更新内存中的数据表示,然后将事物写入文件系统上的 xml 文件。

  public void DoPost()
  
      UpdateData();
      SaveDataToFilesystem();
  

重新启动时,从文件中读取(如果存在)。

要处理并发,您必须在 Update()Save() 方法中锁定数据。

如果系统负载很高,则将“写入文件文件系统”推迟到最多每 10 秒左右一次。

  public void DoPost()
  
      UpdateData();
      QueueWriteToFilesystem();
  

  private MyInternalDataType data;
  private DateTime lastWrite = new DateTime(1970,1,1); // init value
  private void QueueWriteToFilesystem()
  
      ThreadPool.QueueUserWorkItem( MaybeWrite );
  


  private int delayInMilliseconds = 1000 * 10; // 10 seconds
  private void MaybeWrite()
  
      System.Threading.Thread.Sleep(delayInMilliseconds);
      lock (data)
      
          var delta = System.DateTime.Now - lastWrite;
          if (delta < new System.TimeSpan(0, 0, 0, 0, delayInMilliseconds))
          
              // less than 10s since last write
              // do nothing
              return;
          
          ActuallySaveToFilesystem();
          lastWrite = System.DateTime.Now;
      
  

对于真正的高并发,您不希望在每个请求中都排队一个新的工作项。相反,您只需使用写入的专用线程。

  public void DoPost()
  
      UpdateData();
      lastUpdate = System.DateTime.Now;
  

  private void DedicatedWriter()
  
      do
      
          System.Threading.Thread.Sleep(delayInMilliseconds);
          lock (data)
          
              var delta = lastUpdate - lastWrite;
              if (delta < new System.TimeSpan(0, 0, 0, 0, 200))
              
                  // small amount of time since prior write;
                  // do nothing
                  return;
              
              ActuallySaveToFilesystem();
              lastWrite = System.DateTime.Now;
          
       while (true);
  

您还可以使用 AutoResetEvents 来通知编写器线程唤醒。

【讨论】:

以上是关于保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用在 react、graphql 和 apollo 中创建的服务器保存记录时出错

使用命名管道 WCF 服务时通信对象出错

闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入

结合 WCF 服务库和 WCF 服务应用程序

如何在 WCF 中保存用户对象

WCF - 创建简单WCF客户端实现与WCF服务端通信