2009-07-25 2 views
3

У меня возникли проблемы с размещением службы WCF в службе Windows. я могу начать свою службу WCF в VS2008 и перейдя на базовый адрес в моем app.configХостинг службы WCF в службе Windows

<configuration> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="WCF.IndexerBehavior" 
     name="WCF.Indexer"> 
     <endpoint address="" binding="wsHttpBinding" contract="WCF.IIndexer"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" 
contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost/WCFService/Action/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WCF.IndexerBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

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

Теперь моим следующим шагом было создание службы Windows для размещения моего WCF, показанного выше.

Я только что использовал шаблон сервиса te windows, он дал мне Program.cs и Service1.cs, которые я переименовал в WindowsServiceHost.cs. В этом у меня есть:

private ServiceHost host; 

     public WindowsServiceHost() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      try 
      { 
       var serviceType = typeof(Indexer.WCF.Indexer); 
       host = new ServiceHost(serviceType); 
       host.Open(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

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

Все компилируется нормально, я могу запустить InstallUtil (я определил инсталлятор). Служба, которая использовалась для немедленного запуска и остановки, но отключение Windows Defender, избавилась от этого. Теперь служба запускается (как услуга сети) и остается (я думаю), но когда я перехожу к базовому адресу, я получаю страницу не найденную. Еще одна странная вещь, когда я пытаюсь остановить службу (которая по-прежнему отображается как бег), я получаю:

Ошибка 1061: Служба не может принимать управляющие сообщения в это время

Я пробовал все, но я в убыток.

+0

Работает ли ваш сервис как автономный исполняемый файл, который может запускаться из командной строки, то есть в качестве приложения для самостоятельного хостинга?Вам нужно будет заставить это работать, прежде чем вы сможете запустить его как службу Windows в том виде, как вы описываете. Чтобы отладить эту проблему, может быть полезно ввести временную задержку в OnStart, чтобы вы могли присоединить отладчик Visual Studio к процессу службы до того, как остальная часть кода будет выполнена. Он также может помочь регистрировать исключения в журнале событий Windows, а не глотать их. –

ответ

3

Не уверен, что причина в действительности - просто чтобы подтвердить, мы предоставляем услуги WCF в службах Windows все время, и это в целом работает отлично.

Две точки можно попробовать - только, чтобы получить чувство для поведения и потенциальную подсказку для задачи:

1) Я замечаю открытие ServiceHost только с типом сервиса - что работает, но вы все равно можете добавить базовый адрес даже зову new ServiceHost() - как это:

host = new ServiceHost(serviceType, 
         new Uri("http://localhost:8181/WCFService/Action/"); 

вы можете перемещаться по этому адресу и получить страницу службы ??

2) Другая вещь, которую я заметил, что ваша служба, кажется, называется Indexer.WCF.Indexer, как указано в TYPEOF() перед открытием хоста, но в конфигурационном файле, то name= на <service> теге только «WCF.Indexer ».

Вы не могли бы попытаться изменить этот тег следующим образом:

<service behaviorConfiguration="WCF.IndexerBehavior" 
     name="Indexer.WCF.Indexer"> 

ли это помощь? Теперь вы можете видеть страницу сервиса при навигации по ней в браузере?

Марк

0

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

1

Самостоятельное хостинг HTTP в службе Windows, может потребоваться регистрация конечной точки с Httpcfg.exe. Посмотрите here.

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