WCF交换服务接口

本文关键字:接口 服务 交换 WCF | 更新日期: 2023-09-27 18:17:41

我是WCF的新手,还在尝试。

我有两个这样的服务合同:

[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类的新实例。这很明显,因为当客户端创建通道时,服务创建了客户端对象的新实例。我希望实现的是调用第二后第一,但为客户端相同的实例。这可能吗?我知道我可以把这两种方法放在一个服务中,但这不是我想要的。

WCF交换服务接口

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

您可以使用PerSession,因为它使对象在客户机的下一次调用中保持活动状态。当会话结束时对象被释放

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

起初我对你称你的服务实现为"客户端"感到有点困惑:p

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

如果你想在同一个服务实例中处理后续的服务调用,你将不得不使用PerSession或Single InstanceContextModes。

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