状況は次のとおりです。いくつかのWCFサービスを実行している内部サーバーがあり、インターネット全体からそれらにアクセスできるようにしたい。この目的のために、私は公開されているWebサーバーで実行されているルーティングサービスを作成しました。
このルーティングサービスは機能しているように見えますが、メソッドを呼び出そうとすると、常に次のエラーが発生します。
EndpointDispatcherでのContractFilterの不一致が原因で、アクション'http://tempuri.org/IProcessManagementService/ListProcesses'のメッセージを受信者で処理できません。これは、コントラクトの不一致(送信者と受信者の間のアクションの不一致)または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインディング(メッセージ、トランスポート、なしなどのセキュリティ要件を含む)を持っていることを確認します。
サービスからすべてのセキュリティ要件を削除しようとしましたが、wsHTTPエンドポイントとbasicHTTPエンドポイントの両方を使用しました。何もうまくいかないようです。ただし、ルーティングサービスはmexサービスを適切に受け渡しているため、svcutilはクライアントクラスを構築できます。
コードを介してルーターを構成しています。ルーティングサービスには、ルーティングを提供するサービス名のリストと、ルーターおよびサーバーのアドレスが与えられます。
ルーティングサービスの構成は次のとおりです。
<MES.RoutingService.Properties.Settings>
<setting name="RouterAddress" serializeAs="String">
<value>http://localhost:8781/</value>
</setting>
<setting name="ServerAddress" serializeAs="String">
<value>http://10.4.1.117:8781/</value>
</setting>
<setting name="Services" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>ProcessManagementService</string>
<string>TestProcessService</string>
<string>ProcessDataEntryService</string>
<string>ProcessReportingService</string>
</ArrayOfString>
</value>
</setting>
</MES.RoutingService.Properties.Settings>
次のコードで関数を呼び出し、構成ファイルからルーターアドレス、サーバーアドレス、およびサービス名を提供します。
var routers = new List<ServiceHost>();
foreach (var service in _services)
{
var routerType = typeof(IRequestReplyRouter);
var routerContract = ContractDescription.GetContract(routerType);
var serviceHost = new ServiceHost(typeof (System.ServiceModel.Routing.RoutingService));
var serverEndpoints = new List<ServiceEndpoint>();
//Configure Mex endpoints
serviceHost.AddServiceEndpoint(routerType, MetadataExchangeBindings.CreateMexHttpBinding(), _routerAddress + service + "/mex");
serverEndpoints.Add(new ServiceEndpoint(routerContract, MetadataExchangeBindings.CreateMexHttpBinding(), new EndpointAddress(_serverAddress + service + "/mex")));
//RAR SECURITY SMASH.
var binding = new WSHttpBinding(SecurityMode.None);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Message.NegotiateServiceCredential = false;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
//Configure WsHttp endpoints
serviceHost.AddServiceEndpoint(routerType, binding, _routerAddress + service);
serverEndpoints.Add(new ServiceEndpoint(routerContract, binding, new EndpointAddress(_serverAddress + service)));
var basicBinding = new BasicHttpBinding();
serviceHost.AddServiceEndpoint(routerType, basicBinding, _routerAddress + service + "/basic");
serverEndpoints.Add(new ServiceEndpoint(routerContract, basicBinding, new EndpointAddress(_serverAddress + service + "/basic")));
//Set Routing Tables
var configuration = new RoutingConfiguration();
configuration.FilterTable.Add(new MatchAllMessageFilter(), serverEndpoints);
serviceHost.Description.Behaviors.Add(new RoutingBehavior(configuration));
routers.Add(serviceHost);
}
return routers;
サービスは起動時にこの関数を呼び出し、ルーターリストに返された各サービスホストを開きます。
サーバー自体は、次のapp.configを介して構成されます
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="noSecurityBinding">
<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="MES.ProcessManagerServiceLibrary.ProcessManagementService">
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint binding="wsHttpBinding" bindingConfiguration="noSecurityBinding"
contract="MES.ProcessManagerServiceLibrary.IProcessManagementService" />
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
contract="MES.ProcessManagerServiceLibrary.IProcessManagementService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8781/ProcessManagementService/" />
</baseAddresses>
</host>
</service>
<service name="MES.ProcessManagerServiceLibrary.TestProcessService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="noSecurityBinding"
contract="MES.ProcessManagerServiceLibrary.ITestProcessService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
contract="MES.ProcessManagerServiceLibrary.ITestProcessService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8781/TestProcessService/" />
</baseAddresses>
</host>
</service>
<service name="MES.ProcessManagerServiceLibrary.ProcessDataEntryService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="noSecurityBinding"
contract="MES.ProcessManagerServiceLibrary.IProcessDataEntryService" />
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
contract="MES.ProcessManagerServiceLibrary.IProcessDataEntryService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8781/ProcessDataEntryService/" />
</baseAddresses>
</host>
</service>
<service name="MES.ProcessManagerServiceLibrary.ProcessReportingService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="noSecurityBinding"
contract="MES.ProcessManagerServiceLibrary.IProcessReportingService" />
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
contract="MES.ProcessManagerServiceLibrary.IProcessReportingService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8781/ProcessReportingService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
私は何が欠けていますか?
編集:私は問題を見つけたと思います-ルーティングサービスはサービスのためにこの構成を返していました-
<client>
<endpoint address="http://shco-appsrv1.us.shepherd.ad:8781/ProcessManagementService/"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IProcessManagementService"
contract="IProcessManagementService" name="WSHttpBinding_IProcessManagementService" />
<endpoint address="http://shco-appsrv1.us.shepherd.ad:8781/ProcessManagementService/basic"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IProcessManagementService"
contract="IProcessManagementService" name="BasicHttpBinding_IProcessManagementService" />
</client>
これは、外部サーバーではなく、内部サーバーを指します。これがルーティングサービスの標準的な動作なのか、それともオーバーライド可能な動作なのかはわかりません。