あなたの質問へのコメントで述べたように、あなたが持っているものすべてが本当に必要だとは思いませんInternalEndpoints
。これらを WCF エンドポイントと 1 対 1 でペアリングします。これはおそらく間違っています。代わりに、それらを WCF Bindings/Behaviors (つまり、実際にはポートごとに 1 つ) とペアにします。この場合、約 250 の異なる WCF サービスがすべてこの 1 つのエンドポイントを通過します。csdef
以下は、ファイルからの 100% のエンドポイントです。
<Endpoints>
<InputEndpoint name="WcfConnections" protocol="tcp" port="8080" localPort="8080" />
</Endpoints>
(InputEndpoint
代わりにを使用していますがInternalEndpoint
、この質問の観点からは違いはありません。)
この 1 つのエンドポイントはnetTcpBindings
、セルフホステッド TCP サービス アプリケーションの 3 つの異なるものによって使用されます。TCP サービスの Web アプリ バージョンもあり (IIS での簡単なローカル開発ホスティング/テスト用)、使用するバインディングは次のとおりです。
<bindings>
<netTcpBinding>
<binding name="A" maxBufferPoolSize="5242880" maxBufferSize="5242880" maxReceivedMessageSize="5242880" listenBacklog="100" maxConnections="1000">
<readerQuotas maxDepth="256" maxStringContentLength="16384" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="B" maxBufferPoolSize="15728640" maxBufferSize="15728640" maxReceivedMessageSize="15728640" listenBacklog="100" maxConnections="1000">
<!-- 15MB max size -->
<readerQuotas maxDepth="256" maxStringContentLength="15728640" maxArrayLength="15728640" maxBytesPerRead="204800" maxNameTableCharCount="15728640" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="C" maxBufferPoolSize="524288" maxBufferSize="524288" maxReceivedMessageSize="524288" listenBacklog="100" maxConnections="1000">
<!-- 0.5MB max size -->
<readerQuotas maxDepth="256" maxStringContentLength="524288" maxArrayLength="524288" maxBytesPerRead="204800" maxNameTableCharCount="524288" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</netTcpBinding>
</bindings>
最後に、ポートごとに複数のサービスを共有する意思がある限り (非常に負荷の高い状況を除いて、適切なセルフホスティング アプリでは問題ないはずです)、あなたがしていることは不要です。
おそらく、より大きな問題であり、学ぶ必要がある質問は、「セルフホステッド WCF アプリの単一ポートで複数のサービスをホストするにはどうすればよいですか?」ということです。その場合は、次のコードを確認してください (endpoint
ループで使用するオブジェクトは、各 WCF エンドポイントのいくつかの重要な部分を保持する単純な構造体です)。
// Build up Services
var hosts = new List<ServiceHost>();
foreach (var endpoint in endpoints)
{
var host = new ServiceHost(endpoint.ServiceType, new Uri(string.Format("net.tcp://{0}:{1}", FullyQualifiedHostName, SharedTcpPortNumber)));
hosts.Add(host);
foreach (var behavior in MyBehaviorSettings)
{
if (behavior is ServiceDebugBehavior)
host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = (behavior as ServiceDebugBehavior).IncludeExceptionDetailInFaults;
else
host.Description.Behaviors.Add(behavior);
}
if (endpoint.ServiceContract == null)
throw new Exception();
if (endpoint.ServiceBinding == null)
throw new Exception();
if (endpoint.EndpointUrl == null)
throw new Exception();
if (endpoint.ListenUrl == null)
throw new Exception();
// Add the endpoint for MyService
host.AddServiceEndpoint(endpoint.ServiceContract, endpoint.ServiceBinding, endpoint.EndpointUrl, new Uri(endpoint.ListenUrl));
host.Open();
}