2010-04-12 2 views
4

Для некоторого кода тестирования я хотел бы иметь возможность размещать службу WCF всего в нескольких строках. Я полагал, что я написать простой класс хостинг:Является ли это правильным способом размещения службы WCF?

public class WcfHost<Implementation, Contract> : IDisposable 
    where Implementation : class 
    where Contract : class 
{ 
    public readonly string Address = "net.tcp://localhost:8000/"; 
    private ServiceHost _Host; 

    public WcfHost() 
    { 
     _Host = new ServiceHost (typeof (Implementation)); 

     var binding = new NetTcpBinding(); 
     var address = new Uri (Address); 

     _Host.AddServiceEndpoint (
      typeof (Contract), 
      binding, 
      address); 
     _Host.Open(); 
    } 

    public void Dispose() 
    { 
     ((IDisposable) _Host).Dispose(); 
    } 
} 

Это может быть использовано, как это:

using (var host = new WcfHost<ImplementationClass, ContractClass>()) { 

Что не так с этим подходом? Есть ли недостаток в коде (особенно об утилизации)?

ответ

5

Метод Dispose хоста может вызывать исключение, если хост находится в состоянии «сбой». Если это произойдет, вы не увидите, что на самом деле пошло не так, поскольку исходное исключение потеряно. Для тестового кода это может не быть проблемой, но все равно может быть на вашем пути, если вы попытаетесь понять, почему что-то не работает.

Я не проверял, но следующее должен быть в порядке в вашем Dispose метода:

if (_Host.State == CommunicationState.Faulted) 
{ 
    _Host.Abort(); 
} 
else 
{ 
    _Host.Close(); 
} 
+0

Да, я слышал об этой проблеме. Поэтому я вижу это применительно к этому делу. – mafu

+0

Да, мне нужно было выяснить, как эта проблема относится не только к клиентам, но и к хостам ... –

0

Это кажется мне хорошим, если вы в порядке с ограничениями фиксированного привязки и адреса сервера.

Вы должны быть уверены, что код в пределах using длится до тех пор, пока вы хотите, чтобы хост был доступен.

0

Если бы я осуществить это Самообслуживание хозяина, я бы поставил его в службе Windows, используя события OnStart и OnStop , Кроме того, сделайте следующие изменения для передового опыта:

  • Поместите конфигурацию конечной точки в файл App.Config - лучше управлять в производственной среде.
  • Отделите хост-сервис от двоичных файлов реализации и контракта.

Вы также можете посмотреть на сайте MSDN: http://msdn.microsoft.com/en-us/library/ms730158%28v=VS.90%29.aspx Там хорошее, как «Host службы в службе Windows»

+0

Я полагаю, что размещение хоста для _testing_ в службе Windows является по крайней мере чрезмерным или непрактичным. – mafu

+0

Я так не думаю. Если вы выполняете поиск в MSDN, лучшие практики для реализации Self Host устанавливают его с помощью Windows Services. Во всяком случае, его лучше развернуть с использованием того типа хостинга, который вы тестировали раньше. – Erup

+0

@ Erup: Эти лучшие методы для хостинга inproc на MSDN предназначены для работы в wcf-сервисе. Для тестирования, размещение его inproc в тестовом решении имеет гораздо больший смысл. –

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

  • Нет связанных вопросов^_^