Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF一个服务实例的多个通道_C#_Wcf_Servicehost - Fatal编程技术网

C# WCF一个服务实例的多个通道

C# WCF一个服务实例的多个通道,c#,wcf,servicehost,C#,Wcf,Servicehost,这是我的服务器应用程序代码: [ServiceContract] public interface IFirst { [OperationContract] void First(); } [ServiceContract] public interface ISecond { [OperationContract] void Second(); } [ServiceBehavior(InstanceContextMode = InstanceContextM

这是我的服务器应用程序代码:

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

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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class Service : IFirst, ISecond
{
    static int count = 0;
    int serviceID;

    public Service()
    {
        serviceID = ++count;

        Console.WriteLine("Service {0} created.", serviceID);
    }

    public void First()
    {
        Console.WriteLine("First function. ServiceID: {0}", serviceID);
    }

    public void Second()
    {
        Console.WriteLine("Second function. ServiceID: {0}", serviceID);
    }
}

class Server
{
    static void Main(string[] args)
    {
        ServiceHost host = new ServiceHost(typeof(Service), new Uri("net.tcp://localhost:8000"));
        NetTcpBinding binding = new NetTcpBinding();
        host.AddServiceEndpoint(typeof(IFirst), binding, "");
        host.AddServiceEndpoint(typeof(ISecond), binding, "");
        host.Open();

        Console.WriteLine("Successfully opened port 8000.");
        Console.ReadLine();          
        host.Close();
    }
}
客户:

class Client
{
    static void Main(string[] args)
    {
        ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
        IFirst iForst = firstFactory.CreateChannel();
        iForst.First();

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

        Console.ReadLine();

    }
}
在我的例子中,服务器创建了两个服务实例。我要做的是为第一个服务实例调用第二个函数。

您可以做两件事:

移到第二个到第一个

public interface IFirst
{
    [OperationContract]
    void First();

    [OperationContract]
    void Second();
}
或者对服务实例使用单例

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class Service : IFirst, ISecond
{
...
}

把你的行为改成单身

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
当您使用
InstanceContextMode.PerSession时,这意味着当您试图从两个客户端连接到服务时,服务会为每个
客户端创建
会话
,这就是它创建两个服务实例的原因

通过将其更改为
InstanceContextMode。单个
服务实例只能为您的两个客户端提供服务

System.ServiceModel.InstanceContext管理关联 在频道和用户定义的服务对象之间。使用 带有 ServiceBehaviorAttribute.InstanceContextMode属性来指定 InstanceContext对象的生存期。可以创建一个新的 每个调用、每个会话的InstanceContext对象,或指定 InstanceContext对象绑定到单个服务对象。 单个值指定在服务的生命周期内应使用单个InstanceContext对象。


我知道这个职位很老,但对其他人来说

您可以将IFirst和ISecond合并到ICombinedService中。 然后,您将在客户端中创建一个通道,这意味着将创建一个服务主机会话实例

在当前代码中,您正在为IFirst和ISecond创建连接[这是您创建的两个会话实例。]

IFirst iForst=firstFactory.CreateChannel();//创建了第一个会话

ISecond ISecond=secondFactory.CreateChannel();//创建第二个会话

要改变这种行为,您需要将这些服务组合成一个服务;并且可以对该会话进行每会话调用

class Client
{
    static void Main(string[] args)
    {
        ChannelFactory<ICombinedFirstSecond> combinedFactory = new ChannelFactory<ICombinedFirstSecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
        ICombinedFirstSecond iCombinedFirstSecond = combinedFactory.CreateChannel();
        iCombinedFirstSecond.First();
        iCombinedFirstSecond.Second();

        Console.ReadLine();

    }
}
类客户端
{
静态void Main(字符串[]参数)
{
ChannelFactory combinedFactory=新的ChannelFactory(新的NetTcpBinding(),新的EndpointAddress(“net。tcp://localhost:8000"));
ICombinedFirstSecond ICombinedFirstSecond=combinedFactory.CreateChannel();
i组合FirstSecond.First();
i组合firstsecond.Second();
Console.ReadLine();
}
}
这是我认为你真正想要的,而不是一个单身服务

class Client
{
    static void Main(string[] args)
    {
        ChannelFactory<ICombinedFirstSecond> combinedFactory = new ChannelFactory<ICombinedFirstSecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000"));
        ICombinedFirstSecond iCombinedFirstSecond = combinedFactory.CreateChannel();
        iCombinedFirstSecond.First();
        iCombinedFirstSecond.Second();

        Console.ReadLine();

    }
}