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サービスがそれと対話できるようにするサービスを公開します。