2012-10-25 2 views
0

У меня есть служба Windows с библиотекой WCF. На том же компьютере у меня есть приложение Windows Form с включенной в него WCF-службой. Моя проблема возникает, когда я пытаюсь использовать службу в форме из службы Windows.WCF Windows Сервис, потребляющий обслуживание, встроенный в Windows Form

Служба WCF в форме имеет открытую конечную точку «basicHttpBinding», а также «mexHttpBinding». Я могу без проблем протестировать сервис в форме с помощью «тестового клиента WCF».

В службе Windows я могу добавить ссылку на службу службы Form, и все хорошо. Однако, когда я на самом деле запустить службу Windows, и попытаться потреблять службы WCF в форме, я получаю эту ошибку:

The message with Action 'http://tempuri.org/IService1/shutMeDown' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

Смотрите, что «IService1» в там? Я уверен, что это проблема. Сама служба Windows настроена на размещение службы под названием «Service1», как вы можете видеть ниже в разделе <services>. Так что, похоже, что у меня что-то не так в моем app.config.

Мое лучшее предположение, что у меня что-то не так с тем, что у меня есть моя установка <client> в моем app.config. По-видимому, по какой-то причине, когда я пытаюсь использовать службу в Форме, служба Windows использует неправильный адрес. Он использует адрес своего сервиса, а не адрес службы Form.

Вот соответствующие части app.config из моей службы Windows:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IFormControlService" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8700/FormControlService" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFormControlService" 
     contract="Form_ServiceReference.IFormControlService" name="BasicHttpBinding_IFormControlService" /> 
    </client> 
    <services> 
     <service name="smMonitor_wcfServiceLibrary.Service1"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8800/smMonitorService/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="" binding="basicHttpBinding" contract="smMonitor_wcfServiceLibrary.IService1">    
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint>    
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior>    
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" /> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Моя установка заключается в следующем. У меня есть служба Windows, работающая на машине. На той же машине у меня есть Форма Вдовов. Форма Windows предоставляет сервис, который позволит службе Windows взаимодействовать с ним.

+0

Возможно, ваш сервис может взаимодействовать с рабочим столом. Http://lostechies.com/keithdahlby/2011/08/13/allowing-a-windows-service-to-interact-with-desktop-without-localsystem/ – Amitd

+0

ooooh, не считал это. Я предположил, что, поскольку форма подвергает конечную точку через HTTP, что она будет доступна службе Windows, но у вас может быть точка. Я посмотрю. благодаря – davehale23

ответ

0

Моя проблема заключалась в следующем. У меня был только исходящий <bindings>. Что мне нужно сделать, чтобы определить, как входящие и исходящие привязки, как это:

<bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IService1" /> 
      <binding name="BasicHttpBinding_IFormControlService" /> 
     </basicHttpBinding> 
    </bindings> 

Поскольку исходящие привязок не были определены, моя служба Windows, смотрела в <basicHttpBinding> и просто использовать по умолчанию.

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