0

WCFライブラリを備えたWindowsサービスがあります。同じマシン上に、WCFサービスが埋め込まれたWindowsフォームアプリケーションがあります。Windowsサービスからフォームのサービスを利用しようとすると、問題が発生します。

フォームのWCFサービスには、「basicHttpBinding」エンドポイントと「mexHttpBinding」が公開されています。「WCFテストクライアント」を使用してフォームでサービスを問題なくテストできます。

Windowsサービスでは、フォームのサービスにサービス参照を追加でき、すべて問題ありません。ただし、実際にWindowsサービスを実行し、フォームでWCFサービスを利用しようとすると、次のエラーが発生します。

EndpointDispatcherでのContractFilterの不一致により、アクション'http://tempuri.org/ IService1 /shutMeDown'のメッセージを受信者で処理できません。これは、コントラクトの不一致(送信者と受信者の間のアクションの不一致)または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインディング(メッセージ、トランスポート、なしなどのセキュリティ要件を含む)を持っていることを確認します。

そこにある「IService1」を参照してください。それが問題だと私はかなり確信しています。<services>以下のセクションでわかるように、Windowsサービス自体は「Service1」と呼ばれるサービスをホストするように構成されています。したがって、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>

発信バインディングが定義されていないため、私の Windows サービスは を検索<basicHttpBinding>し、デフォルトのものを使用していました。

于 2012-10-25T19:50:08.930 に答える