2012-04-25 3 views
1

Я принимаю WCF как службу Windows с помощью net.tcp. После установки службы Windows при запуске службы я получаю, что служба была запущена и остановлена.Хостинг WCF как служба Windows «Служба была запущена и остановлена»

Ошибка указана для того, чтобы добавить конечную точку к сервису MYService, необходимо указать непустое имя контракта. в System.ServiceModel.Description.ConfigLoader.LookupContract (String, String contractName SERVICENAME)

Моя OnStart функция следующим

protected override void OnStart(string[] args) 
     { 
      try 
      { 
       if (myServiceHost != null) 
       { 
        myServiceHost.Close(); 
       } 
       myServiceHost = new ServiceHost(typeof(MYservice)); 
       myServiceHost.Open(); 

      } 
      catch (Exception ex) 
      { 
       log.Error("ONStart", ex); 
       throw; 
      } 

     } 

конфигурационный файл выглядит следующим образом:

<serviceHostingEnvironment minFreeMemoryPercentageToActivateService="10" /> 
<services> 
    <service behaviorConfiguration="myServiceBehavior" 
    name="myNamespace.myTestService"> 
    <endpoint binding="netTcpBinding" bindingConfiguration="netTCPBindingConfig" contract="myNamespace.ServiceInterface.ImyTestService" /> 
    <endpoint binding="mexTcpBinding" bindingConfiguration="" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://10.1.3.69:8523/TestService" /> 
     </baseAddresses> 
     <timeouts closeTimeout="10:00:10" openTimeout="10:01:00" /> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="myServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

+0

, пожалуйста, разместите конфигурацию WCF –

+0

Ошибка в вашем файле конфигурации. Такое поведение характерно для случая, когда во время запуска службы произошло некоторое исключение. Отправьте свой конфиг. – paramosh

ответ

4

В файле конфигурации есть:

<endpoint binding="netTcpBinding" bindingConfiguration="netTCPBindingConfig" contract="myNamespace.ServiceInterface.ISomeService" /> ` 

Вместо ISomeService, необходимо указать какой интерфейс реализуется MYService.

EDIT

Кроме того, MEX привязка должна иметь контракт, указанный, т.е. contract="IMetadataExchange"

EDIT СНОВА

Для вашего удобства, это то, как ваши MEX связывание должно выглядеть следующим образом:

<endpoint binding="mexTcpBinding" address="mex" bindingConfiguration="" contract="IMetadataExchange" /> 
+0

Ofcourse Я указал Interfacename, которое реализовано службой – xaria

+1

@xaria. Кроме того, все конечные точки должны иметь указанный контракт. –

+0

После того, как я добавил контракт на конечную точку mex, я получаю следующую ошибку System.InvalidOperationException: экземпляр привязки уже был связан с прослушиванием URI 'net.tcp: //10.1.3.69: 8523/TestService'. Если две конечные точки хотят использовать один и тот же ListenUri, они также должны использовать один и тот же экземпляр объекта привязки. Две конфликтующие конечные точки были либо указаны в вызовах AddServiceEndpoint(), либо в файле конфигурации, либо в сочетании с AddServiceEndpoint() и конфигурацией. – xaria

-2

Пожалуйста, попробуйте следующее:

 protected override void OnStart(string[] args) 
     { 
      try 
      { 
       myServiceHost = new ServiceHost(typeof(MYservice)); 
       myServiceHost.Open(); 
       Console.ReadKey(); 
      } 
      catch (Exception ex) 
      { 
       log.Error("ONStart", ex); throw; 
      } 
      finally 
      { 
       myServiceHost.Close(); 

      } 
     } 
+0

Наверняка, это только собирается закрыть службу, как только она начнется. Закрытие необходимо выполнить при выключении. – Bronumski

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