Доступ к объекту, на котором размещен сервис - PullRequest
2 голосов
/ 02 мая 2011

Я использую WCF 4 с C #. Я использую InstanceContextMode для Single . Экземпляр класса, реализующего мой контракт, создается с использованием конструктора, который принимает ссылку на объект, на котором размещен сервис. Объект службы передается при создании и размещении хоста службы.

Код реализации услуги:

[ServiceBehavior(UseSynchronizationContext = false, 
     InstanceContextMode = InstanceContextMode.Single)]   
public class ServiceImpl : IMyContract
{
   private ServiceHoster _sh;
   ServiceImpl(ServiceHoster sh)
   {
      _sh = sh;
   }

   public string Call(string input)
   {
      ... //Do some processing on the input string

      return _sh.ProcessCall(string input);
   }
}

ServiceHoster код:

public class ServiceHoster
{
    private ServiceImpl ns;

    ServiceHoster()
    {
       ...
       Start();
    }

    private void Start()
    {
       //Host Service
       ns = new ServiceImpl(this);

        //Instantiate NetTCP service
        _tcpServiceHost = new ServiceHost(ns, new Uri("net.tcp://localhost:8089"));
        _tcpServiceHost.Open();
    }

    private void Stop()
    {
      if(ns != null && ns.State == CommunicationState.Opened)
        ns.Close();
    }

    public string ProcessCall(string input)
    {
       ...
       return result;
    }
}

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что нам нужна двусторонняя связь между клиентом и сервером. Для дуплексного соединения нам нужно установить InstanceContextMode , установить PerSession .

Мои вопросы:

  1. Могу ли я использовать несколько значений для InstanceContextMode несколько как (который Думаю не возможно)?

  2. Есть ли другой способ для ServiceImpl объект, чтобы получить ссылку объекта, на котором он находится?

  3. Могу ли я что-нибудь сделать иначе решить проблему?

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Прежде всего, я не думаю, что вам нужно что-то делать с вашим InstanceContextMode.См. Эту ветку форума MSDN / WCF для получения дополнительной информации о том, как вы можете сохранить список подключенных клиентов: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/463dd4a2-f9db-4773-b373-7dd470e65f90/

Если вы все еще хотите пойти по этому пути, я бы посоветовал вам реализовать поставщика экземпляров (внедрив экземпляр IInstanceProvider и подключив его к ServiceHost с поведением по вашему выбору.)

Если вы Google для IInstanceProvider, вы найдете примеры того, как это делается - если выиспользуйте контейнер IoC, вы, скорее всего, найдете для него интеграцию WCF, которая работает таким образом.

0 голосов
/ 02 мая 2011

Получить ссылку на serviceHost для текущего запроса, например:

OperationContext.Current.Host
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...