我有两个服务合同,它们被实现为一个。当然,我正在为这些合同创建两个客户端代理。是否可以维护这两个代理之间的会话。 (顺便说一下,我刚刚开始使用WCF,所以如果我太愚蠢的话,请给我一些懈怠)
举个例子,
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IFoo
{
[OperationContract]
void DoFoo(int something);
}
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IBoo
{
[OperationContract]
int DoBoo();
}
[ServiceBehavior(InstanceContextMode =InstanceContextMode.PerSession)]
public class myservice: IFoo, IBoo
{
int somevalue;
void DoFoo(int something)
{
somevalue = something;
}
int DoBoo()
{
return somevalue;
}
}
客户端代码: 使用ServiceReference1;
static void main()
{
DoFooServiceClient fooproxy = new DoFooServiceClient();
DoBooServiceClient booproxy = new DoBooServiceClient();
fooproxy.DoFoo(5);
Console.WriteLine(booproxy.DoBoo());
}
我希望它返回5但它返回0.我知道什么是错的,它确实创建了两个实例,但它是否可以强制它们使用相同的实例?如果我使用静态不是所有客户端的值相同吗?
答案 0 :(得分:1)
由于WCF实例化在服务合同级别运行,您将很难在这两种服务之间共享内存。
是的,您可以使用某种静态类型,但正如您所说,该值将在所有服务实例之间同步,这不是您需要的行为。
一个选项是使用一些持久性资源(如数据库或单例服务实例)来存储此共享数据。
如果要将Doo和Foo定义为用于实例化的单例服务,则可能有另一种选择。这意味着您可以直接从服务主机访问每个服务的状态,但需要一些中介逻辑来同步它们之间的值。
我会尝试使用中介逻辑来同步值,但这需要 额外的客户端代码,不是吗?
它不需要客户端代码,但服务主机上的某些内容可以在两个服务实例之间同步值。如果服务都是单例实例,我只能想到一种方法。如果您使用IIS进行托管,这会变得更加复杂,因为这意味着您不会暴露给实际的ServiceHost实例。