C# WCF交换服务接口

C# WCF交换服务接口,c#,.net,wcf,C#,.net,Wcf,我是WCF新手,还在试验 我有两份这样的合同: [ServiceContract] public interface IFirst { [OperationContract(IsOneWay = true)] void First(); } [ServiceContract] public interface ISecond { [OperationContract(IsOneWay = true)] void Second(); } 在实现这些接口的服务器端

我是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();
ChannelFactory firstFactory=new ChannelFactory(new NetTcpBinding(),new EndpointAddress(“net。tcp://localhost:8000"));
IFirst IFirst=firstFactory.CreateChannel();
i First.First();
ChannelFactory secondFactory=新的ChannelFactory(新的NetTcpBinding(),新的EndpointAddress(“net。tcp://localhost:8000"));
ISecond ISecond=secondFactory.CreateChannel();
iSecond.First();

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

根据我的理解,您希望在只创建一个客户端时调用这两个方法。 在WCF中,可以通过设置服务行为属性的InstanceContextMode属性来控制实例。有三个可能的值 -珀索尔 -迫害 -单身

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

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


希望这能有所帮助。

起初,您将服务实现称为“客户端”,我有点困惑:p

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

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

很好地总结了WCF中的会话、实例和并发性