我编写了一个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();
}
答案 0 :(得分:18)
默认情况下,WCF instanceMode设置为Per call,这意味着服务中使用的数据特定于该方法调用的客户端。
在您的实施中尝试添加
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single)]
public class MyService: IService
这使服务基本上成为单身人士。
答案 1 :(得分:8)
您要做的是创建durable service:
WCF持久服务是WCF服务 操作可以记住 私有变量的值(= 中间的服务状态 重新启动serivcehost和/或 客户端。
答案 2 :(得分:3)
您是否希望在ServiceHost
实例的生命周期之后保留数据?如果是这样,那么我同意耐用的服务是有道理的。
但是,如果您只想在服务活动时调用WCF服务之间保持数据,那么在我看来,持久服务是过度的。使用静态数据是完全可以接受的这正是我在WCF项目中所做的。实际上,您显示的代码应该工作,所以此处还会发生其他事情。
Main()
方法实际上就像你展示的那样吗?如果是这样,那就是一个问题。启动WCF的控制台应用程序启动后,会立即关闭,并使用WCF服务。你需要有一些逻辑来保持控制台应用程序的活动,因为在控制台应用程序运行时,WCF服务只会保持“托管”状态。
如果这不是问题,请告诉我,我将添加一个简单应用程序的完整代码,演示如何执行此操作。
答案 3 :(得分:-4)
添加:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
在您的课程之上,您将拥有一个单一实例的服务(即类别保护相同),并允许多个并发连接。
现在您必须处理您的属性读/写,即使用您已经完成的锁(或其他技术)。