WCF Несколько каналов для одного экземпляра службы - PullRequest
2 голосов
/ 14 декабря 2011

Это мой код для серверного приложения:

[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();

    }
}

Когда я его запускаю, я получаю вывод:

Successfully opened port 8000.
Service 1 created.
First function. ServiceID: 1
Service 2 created.
Second function. ServiceID: 2

InВ моем случае сервер создает два экземпляра службы.Я хочу вызвать функцию Second для того же экземпляра службы, что и First.

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Вы можете сделать две вещи:

Переместиться во-вторых на IFirst, поэтому

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

    [OperationContract]
    void Second();
}

Или используйте Singleton для экземпляра службы

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class Service : IFirst, ISecond
{
...
}
1 голос
/ 14 декабря 2011

Измените свое поведение на одиночное

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

Поскольку вы используете InstanceContextMode.PerSession, это означает, что служба создает a session для каждого client, поскольку вы пытаетесь подключиться к службе от двух клиентов, поэтомусоздает два экземпляра Сервиса

, изменяя его на InstanceContextMode.Single. Только один экземпляр Сервиса будет обслуживать обоих ваших клиентов.

От MSDN

System.ServiceModel.InstanceContext управляет связью между каналом и пользовательскими объектами обслуживания .Используйте перечисление InstanceContextMode со свойством ServiceBehaviorAttribute.InstanceContextMode, чтобы указать время жизни объекта InstanceContext.может создать новый объект InstanceContext для каждого вызова, каждого сеанса или указать, что объект InstanceContext привязан к одному объекту службы. Значение Single указывает, что один объект InstanceContext должен использоваться в течение срока службы службы.

0 голосов
/ 02 ноября 2015

Я знаю, что пост старый, но для других.

То, что вы можете сделать, это объединить ваш 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();

    }
}

Это то, что, я думаю, вы действительно ищете, а не одноразовая служба.

...