3

netTcpBinding で WCF を使用してクライアント サーバー アプリを開発しています。

私のソリューションには、クライアントとサーバーの 2 つのプロジェクトがあります。

これまでのところ、WCF サービスを機能させるには、app.config ファイルでいくつかの構成を行う必要があることを学びました。これは私がやったもので、うまくいっています。

しかし、クライアントが接続するために、サービスをサーバーに展開するときに何をすべきかを見つけるのに問題があります。私の問題は、「localhost」以外の場所にサービスをデプロイするときに、app.config (または他の場所) で何を変更する必要があるかわからないことです。

これが私のサーバー アプリの app.config ファイルです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="MMServidor3.ServidorCliente">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
          contract="MMServidor3.iServicioMM">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:4005/MMServidor3/" />
            <add baseAddress="net.tcp://localhost:4006/MMServidor3/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

「mex」エンドポイントと http プロトコル ベース アドレスは、クライアントがメタデータを取得するために存在します (それ以外の方法では取得できませんでした)。

したがって、サーバーをデプロイする場所の IP アドレスが事前にわからないため、構成ファイルまたは ini ファイルからエンドポイントを読み取る必要があります (エンドポイントごとにコンパイルする必要はありません)。 .

また、クライアント側で何を変更する必要がありますか? クライアント app.config の関連セクションは次のとおりです。

<system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_iServicioMM" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:4006/MMServidor3/" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_iServicioMM" contract="MMServicioServidor.iServicioMM"
                name="NetTcpBinding_iServicioMM">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

アドバイスをいただければ幸いです。

4

1 に答える 1

3

構成ファイルは環境に固有です。通常、(必要に応じて)localhostサービス アドレスのビットを IP アドレスまたは名前に変更します。

クライアントにとってもそれは同じです。production-client は、運用環境で運用サービスの URL を使用するように構成する必要があります。もちろん、サービスが配置される場所がわかるまで、クライアントを構成することはできません*。

残念ながら、各クライアント エンドポイントの URL を個別に指定する必要があります。詳細については、この関連する質問をご覧ください。あなたが解決できる1つの代替案は、クライアント側の「BaseAddress」に独自の設定を実装し、それを使用してプログラムでエンドポイントアドレスを指定することです。


* サービスとクライアントを特定する際にさらに極端な柔軟性を求めている場合は、WCF ディスカバリー メカニズムを調べることができます。


**別の補足として、さまざまな環境の構成ファイルの作成を自動化する場合は、(たとえば) SlowCheetahを使用することをお勧めします。

于 2012-10-22T11:39:55.870 に答える