2013-09-04 3 views
0

Предположим, что вы контролируете набор промышленных устройств через службы WCF. Каждое устройство будет размещать свою собственную службу WCF. Давайте назовем эту общую службу WCF MyDeviceController Я хочу написать один раз и развернуть на каждом устройстве. Однако для целей тестирования я также хочу развернуть все экземпляры WCF в одном локальном поле.создание нескольких служб WCF

В этом контексте, как развернуть несколько экземпляров служб WCF как локальных, так и нескольких ящиков?

Если я слишком расплывчатый, пожалуйста, помогите мне уточнить мой вопрос. Я более чем счастлив изменить его.

+1

Вы можете иметь столько узлов услуг (1 экземпляр службы на хосте), как у вас есть ресурсы для проведения тот же самый ящик. Каждому хозяину службы будет свой собственный уникальный конечный пункт. Так, например, вы могли бы иметь «http: // server/device1», «http: // server/device2» и т. Д. - каждый из них запускался бы в своем собственном «ServiceHost». В качестве альтернативы, поскольку его та же услуга вы можете поместить в один «ServiceHost» и выставить несколько конечных точек, но я думаю, что это может быть немного отличается от того, что вы ищете. – Tim

ответ

0

Я написал простой в обращении службы хост один раз:

public static class SimpleServiceHost<ServiceContract, Service> 
{ 
    private static Thread hostThread; 
    private static object _lockStart = new object(); 
    private static object _lockStop = new object(); 

    public static bool IsRunning { get; set; } 

    public static void WaitUntilIsStarted() 
    { 
     while (!IsRunning) 
     { 
      Thread.Sleep(100); 
     } 

    } 

    public static void Start(Binding binding, string host, string path, int port) 
    { 
     var serviceUri = new UriBuilder(binding.Scheme, host, port, path).Uri; 
     Start(binding, serviceUri); 
    } 

    public static void Start(Binding binding, Uri serviceUri) 
    { 
     lock (_lockStart) 
     { 
      if (hostThread == null || !hostThread.IsAlive) 
      { 
       hostThread = new System.Threading.Thread(() => 
       { 
        using (ServiceHost internalHost = new ServiceHost(typeof(Service))) 
        { 
         internalHost.Faulted += new EventHandler((o, ea) => 
          { 
           IsRunning = false; 
           throw new InvalidOperationException("The host is in the faulted state!"); 
          }); 
         internalHost.AddServiceEndpoint(typeof(ServiceContract), binding, serviceUri); 

         try 
         { 
          internalHost.Open(); 
          IsRunning = true; 
         } 
         catch 
         { 
          IsRunning = false; 
         } 

         while (true) 
          Thread.Sleep(100); 
        } 
       }); 
      } 

      hostThread.Start(); 
     } 
    } 

    public static void Stop() 
    { 
     lock (_lockStart) 
     { 
      lock (_lockStop) 
      { 
       hostThread.Abort(); 
       IsRunning = false; 
      } 
     } 
    } 

} 

Так что, если вы готовы использовать несколько контрактов вы можете просто позвонить так:

SimpleServiceHost<IService, Service>.Start(new BasicHttpBinding(), "localhost", "TestService", 8086); 

В противном случае сделать свой сервис принимающей работу как фабрика и возвращать экземпляры при вызове start. Вероятно, вам нужно будет повысить класс, чтобы соответствовать вашим требованиям. Но сэкономить много кода, особенно когда вам нужно динамически разместить несколько сервисов ;-)

С уважением Jan

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