WCF交换服务接口

时间:2011-12-14 02:01:35

标签: c# .net wcf

我是WCF的新手并且仍在尝试。

我有两个这样的ServiceContract:

[ServiceContract]
public interface IFirst
{
    [OperationContract(IsOneWay = true)]
    void First();
}

[ServiceContract]
public interface ISecond
{
    [OperationContract(IsOneWay = true)]
    void Second();
}

在服务器端实现这些接口的客户端类:

public class Client : IFirst, ISecond
{
    static int count = 0;
    int id;

    public Client()
    {
        count++;
        id = count;
        Console.WriteLine("{0} client created.", id);
    }

    public void First()
    {
        Console.WriteLine("First from: " + id.ToString());
    }

    public void Second()
    {
        Console.WriteLine("Second: " + id.ToString());
    }
}

和主持人:

ServiceHost host = new ServiceHost(typeof(Client), new Uri("net.tcp://localhost:8000"));
NetTcpBinding binding = new NetTcpBinding();
host.AddServiceEndpoint(typeof(IFirst), binding, "");
host.AddServiceEndpoint(typeof(ISecond), binding, "");
host.Open();

在客户端:

ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
IFirst iFirst = firstFactory.CreateChannel();
iFirst.First();

ChannelFactory<ISecond> secondFactory = new ChannelFactory<ISecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
ISecond iSecond = secondFactory.CreateChannel();
iSecond.First();

这很好用。它调用First然后调用Second方法,但是每次调用都会创建Client类的新实例。很明显,因为当客户端创建通道时,服务会创建Client对象的新实例。我希望实现的是先调用Second,但是对于Client的同一个实例。它甚至可能吗?我知道我可以把这两种方法放在一个服务中,但这不是我想要的。

2 个答案:

答案 0 :(得分:1)

根据我的理解,您只想在创建一个客户端时调用这两种方法。 在WCF中,您可以通过设置Service Behavior Attribute的InstanceContextMode属性来控制Instancing。有三个可能的值 -PerCall -PerSession - 单

您可以使用PerSession,因为它可以使对象保持活动状态,以便从客户端进行下一次调用。 会话结束时释放对象

你可以装饰你的班级 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

希望这有帮助。

答案 1 :(得分:0)

起初我打电话给你的服务实施&#34;客户&#34; :P

但无论如何,默认情况下,WCF使用InstanceContextMode.PerCall,这意味着它将为服务中的每个请求实例化一个新的Service实现实例。

如果要在同一服务实例中处理后续服务调用,则必须使用PerSession或Single InstanceContextModes。

http://msdn.microsoft.com/en-us/library/ms731193.aspx很好地总结了WCF中的会话,实例和并发。