保存在 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 服务中创建的列表,以便在服务重新启动时查看它的主要内容,如果未能解决你的问题,请参考以下文章