2014-01-24 2 views
0

У вас возникли проблемы с клиентскими подключениями, которые необходимо передать между потоками.Передача ClientConnections вокруг разных процессов

1.) У нас есть класс обслуживания

public class Service : ServiceBase 
    { 
     public ServiceHost serviceHost = null; 

     public CMLiteService() 
     { 
      ServiceName = "MyService"; 
     } 

     public static void Main() 
     { 
      ServiceBase.Run(new Service()); 
     } 

     protected override void OnStart(string[] args) 
     { 
      try 
      { 
       if (serviceHost != null) 
       { 
        serviceHost.Close(); 
       } 

       Uri baseAddress = new Uri("net.pipe://localhost/Service"); 

       // Step 2 Create a ServiceHost instance 
       serviceHost = new ServiceHost(typeof(Service), baseAddress); 


       // Step 3 Add a service endpoint. 
       serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "Service"); 

       serviceHost.Open(); 

      } 
      catch(Exception e) 
      { 

      } 

     } 

     protected override void OnStop() 
     { 
      if (serviceHost != null) 
      { 
       serviceHost.Close(); 
       serviceHost = null; 
      } 
     } 
    } 

2.) у нас есть интерфейс

[ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     string InitalizeDataStore(string uri1, string uri2); 
     [OperationContract] 
     string CheckHealth(); 
     [OperationContract] 
     string CreateObject(string parameters); 
    } 

3.) У нас есть метод, который инициализирует Наше хранилище данных

ObjectOperations objectOperations; 
public InitalizeDataStore (string uri1, string uri2) 
{ 
    Admin admin = new Admin(uri1, uri2); 
    objectOperations = new ObjectOperations(admin.client1, admin.client2); 
} 

4.) Вот класс администратора, который выполняет фактическое подключение к базе данных, причем оба клиента являются потокобезопасными и поддерживают m ultithreading

StorageClient1 client1 
StorageClient2 client2 
string URI1; 
string URI2; 

public AdminServices(string uri1, string uri2) 
    { 
     URI1 = uri1; 
     URI2 = uri2; 

     InitializeClient1(); 
     InitializeClient2(); 
    } 

    public StorageClient1 InitializeClient1() 
    { 
     try 
     { 
      client1 = new Client(new Uri(URI1)); 
      client1.Connect(); 
      return client1; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

    public Client2 InitializeClient2() 
    { 
     try 
     { 
      client2 = new Client(new Uri(URI2)); 
      client2.Connect(); 
      return client2; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

5.) Когда мы начинаем службу и запустить метод инициализации он подключается и работает. Но когда мы запускаем другой процесс, клиентские соединения равны нулю? Если мы запускаем код сверху вниз в одном консольном приложении, он работает, но мы нуждаемся в запуске инициализации один раз, а затем клиентское соединение должно быть установлено для будущих процессов.

Итак, процесс 1:

IService pipeProxy = pipeFactory.CreateChannel(); 
pipeProxy.InitalizeDataStore(); //Returns "Connected" 

Process 2: 
IService pipeProxy = pipeFactory.CreateChannel(); 
pipeProxy.CheckHealth(); //returns null 

Как мы страхуем, что детали подключения клиента также сделаны воевавших в другом процессе. Я тоже очень новичок, поэтому я не слишком много думал о многопоточности.

+0

Почему вы ожидаете, что эти вещи будут существовать через процессы? Как правило, процессы не обмениваются памятью. Почему бы просто не использовать отдельные потоки в одном процессе? –

ответ

1

Я считаю, что вы пытаетесь достичь обслужен режиме экземпляра WCF Singleton:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 

Атрибут ваш реализующий класс с вышеизложенным, и все клиенты будут делить экземпляр.

+0

Я недавно столкнулся с этим атрибутом. Означает ли это, что если я что-то запрошу, а другой человек попросит то же самое, что другой человек получит данные только после того, как я был подан. Способствует ли этот метод масштабируемости? –

+0

Абсолютно. Имейте в виду, что это решение требует минимального количества изменений архитектуры в вашем существующем коде. Если бы вы захотели внести дополнительные изменения, я бы рекомендовал придерживаться режима экземпляра SingleCall (который по умолчанию) и рефакторинг существующего кода, чтобы классы WCF на стороне службы совместно использовали внутренний экземпляр класса Admin (возможно, статический экземпляр используя шаблон [Singleton] (http://msdn.microsoft.com/en-us/library/ff650316.aspx) (который не следует путать с синтаксисом WCF). –

Смежные вопросы