多个WCF服务合同以共享同一会话

时间:2016-06-03 06:42:22

标签: c# .net wcf

我有两个服务合同,它们被实现为一个。当然,我正在为这些合同创建两个客户端代理。是否可以维护这两个代理之间的会话。 (顺便说一下,我刚刚开始使用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.我知道什么是错的,它确实创建了两个实例,但它是否可以强制它们使用相同的实例?如果我使用静态不是所有客户端的值相同吗?

1 个答案:

答案 0 :(得分:1)

由于WCF实例化在服务合同级别运行,您将很难在这两种服务之间共享内存。

是的,您可以使用某种静态类型,但正如您所说,该值将在所有服务实例之间同步,这不是您需要的行为。

一个选项是使用一些持久性资源(如数据库或单例服务实例)来存储此共享数据。

如果要将Doo和Foo定义为用于实例化的单例服务,则可能有另一种选择。这意味着您可以直接从服务主机访问每个服务的状态,但需要一些中介逻辑来同步它们之间的值。

  

我会尝试使用中介逻辑来同步值,但这需要   额外的客户端代码,不是吗?

它不需要客户端代码,但服务主机上的某些内容可以在两个服务实例之间同步值。如果服务都是单例实例,我只能想到一种方法。如果您使用IIS进行托管,这会变得更加复杂,因为这意味着您不会暴露给实际的ServiceHost实例。