如何使用内存中持久存储编写WCF服务?
我编写了一个WCF服务,但存储在Service实现中的数据在调用之间不会持续存在,即使存储在静态变量中也是如此。 我能做什么?
服务实现如下:
public class Storage : IStorage { protected static object[] _data; #region IStorage Members public void Insert(object[] data) { lock (_data) { _data = _data.Concat(data).ToArray(); } } public object[] SelectAll() { lock (_data) { return (object[])_data.Clone(); } } #endregion }
服务主机是控制台应用程序:
static void Main(string[] args) { ServiceHost serviceHost = new ServiceHost(typeof(TimeSpanStorage)); serviceHost.Open(); Console.WriteLine("Service running. Please 'Enter' to exit..."); Console.ReadLine(); }
默认情况下,WCF instanceMode设置为Per call,这意味着服务中使用的数据特定于该方法调用的客户端。
在您的实现尝试添加
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single)] public class MyService: IService
这使得服务基本上是单身。
您要做的是创建一个持久的服务 :
WCF持久服务是WCF服务,其中操作可以记住在serivcehost和/或客户端重新启动之间的私有变量(=服务状态)的值。
您是否希望在ServiceHost
实例的生命周期之后保留数据? 如果是这样,那么我同意耐用的服务是有道理的。
但是,如果您只想在服务处于活动状态时在 WCF服务的调用之间保持数据,那么在我的拙见中,持久服务是过度的。 使用静态数据是完全可以接受的 这正是我在WCF项目中所做的。 事实上,你所展示的代码应该可以工作,所以这里还有别的东西。
Main()
方法实际上就像你展示的一样吗? 如果是这样,那就是一个问题。 启动WCF的控制台应用程序启动后,会立即关闭,并使用WCF服务。 您需要在其中具有一些逻辑以使控制台应用程序保持活动状态,因为在控制台应用程序运行时,WCF服务将仅保持“托管”状态。
如果这不是问题,请告诉我,我将添加一个简单应用程序的完整代码,演示如何执行此操作。
加:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
在您的课程之上,您将拥有一个单一实例的服务(即类保护保持不变),并允许多个并发连接。
现在你必须处理你的属性读/写,即使用你已经完成的锁(或其他一些技术)。
上述就是C#学习教程:如何使用内存中持久存储编写WCF服务?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/962759.html