0

我有一个带有 WCF 库的 Windows 服务。在同一台机器上,我有一个嵌入了 WCF 服务的 Windows 窗体应用程序。当我尝试从 Windows 服务使用表单中的服务时,出现了我的问题。

表单中的 WCF 服务具有公开的“basicHttpBinding”端点以及“mexHttpBinding”。我可以使用“WCF 测试客户端”在表单中测试服务,没有任何问题。

在 Windows 服务中,我可以添加对表单服务的服务引用,一切都很好。但是,当我实际运行 Windows 服务并尝试在表单中使用 WCF 服务时,我收到此错误:

由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action 'http://tempuri.org/ IService1 /shutMeDown' 的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

看到那里的“IService1”了吗?我很确定这就是问题所在。Windows 服务本身被配置为托管一个名为“Service1”的服务,您可以在下面的<services>部分中看到。所以看来我的 app.config 中一定有问题。

我最好的猜测是我<client>在 app.config 中的设置方式有问题。似乎,由于某种原因,当我尝试使用表单中的服务时,Windows 服务使用了错误的地址。它使用的是自己服务的地址,而不是表单服务的地址。

以下是我的 Windows 服务中 app.config 的相关部分:

<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 服务与之交互的服务。

4

1 回答 1

0

我的问题如下。我只<bindings>定义了传出。我需要做的是像这样定义传入和传出绑定:

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

Since the outgoing bindings were not defined, my Windows Service was looking in the <basicHttpBinding> and just using the default one.

于 2012-10-25T19:50:08.930 回答