2

WCF サービスでは、25 個の内部エンドポイントという Azure の制限に達しています。SOA の原則に従って、私たちの WCF サービスはかなり小さく、通常、システム内の "名詞" ごとに 1 つです。サービス コントラクトごとに 1 つの Azure InternalEndpoint を定義しています。26 番目の WCF サービスを追加したいのですが、エンドポイントが 25 に制限されているため、追加できません。この Azure の制限のためだけに、勝手にサービス コントラクトの組み合わせを開始したくはありません。

質問: サービス コントラクトごとに 1 つのエンドポイントを必要としない、多数の WCF サービスをホストするためのより良い方法はありますか?

csdef ファイルのスニペットの例を次に示します。

<ServiceDefinition name="MyDeployment" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="MyWorkerRole" vmsize="Small">
    <Endpoints>
      <InternalEndpoint protocol="tcp" name="IUserService" />
      <InternalEndpoint protocol="tcp" name="IArticleService" />
      <InternalEndpoint protocol="tcp" name="IDocumentService" />
      <InternalEndpoint protocol="tcp" name="ICommentingService" />
      <InternalEndpoint protocol="tcp" name="ILocationService" />
      <InternalEndpoint protocol="tcp" name="IAuthorizationService" />
      <InternalEndpoint protocol="tcp" name="IAuthenticationService" />
      <InternalEndpoint protocol="tcp" name="ILoggingService" />
      <InternalEndpoint protocol="tcp" name="IService09" />
      <InternalEndpoint protocol="tcp" name="IService10" />
      <!-- and so on -->
      <InternalEndpoint protocol="tcp" name="IService24" />
      <InternalEndpoint protocol="tcp" name="IService25" />
      <InternalEndpoint protocol="tcp" name="IServiceWeWantToAddButCannot" />
    </Endpoints>
</ServiceDefinition>
4

3 に答える 3

0

あなたの質問へのコメントで述べたように、あなたが持っているものすべてが本当に必要だとは思いません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();
}
于 2013-04-01T20:35:07.243 に答える