2

私のApp.configでは、このベースアドレスが指定されています(「jerrycan」は私のコンピューターの名前です):

<service behaviorConfiguration="helloWorldServiceBehavior" name="OpdService.OpdService">
    <endpoint address="/service" binding="netTcpBinding" bindingConfiguration="NewBinding0"
      name="MainEndPoint" contract="OpdService.IOpdService">
      <identity>
        <dns value="jerrycan" />
      </identity>
    </endpoint>
    <endpoint kind="udpDiscoveryEndpoint" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://jerrycan:8000" />
        <add baseAddress="http://jerrycan/service" />
      </baseAddresses>
      <timeouts openTimeout="00:00:15" />
    </host>
  </service>

他のコンピューターでサービスを実行するまで、すべて正常に動作します — クライアントは UDP 検出を通じてサービスを見つけることができますが、サービスが古いアドレスを送信し続けるため、接続できません。「jerrycan」を「localhost」に変更すると、ローカル クライアントのみがサービスに接続できます (ただし、どのコンピューターでも)。他のコンピューター上のクライアントは、「localhost」に接続しようとしますが、成功しません。

では、再コンパイルせずに別のコンピューターでサービスを実行できるようにするには、ホスト アドレスとして何を使用すればよいでしょうか? すべてのコンピューターの構成ファイルのどこかにアドレスを保存する必要がありますか、それとも実行時にアドレスを変更する必要がありますか? ここには、単純で基本的なものが欠けていると思います。

または、(多くの wcf サンプルのように) localhost を使用する必要があるかもしれませんが、問題を引き起こすのは私のクライアント接続コードです。

EndpointAddress endpointAddress = findResponse.Endpoints[0].Address;
OpdChannelFactory = new DuplexChannelFactory<OpdServiceReference.IOpdService>(CallbackHandler,
                        new NetTcpBinding("MainEndPoint"), endpointAddress);

繰り返しますが、「localhost」をベース アドレスとして使用すると、「localhost」がエンドポイント アドレスになりfindResponseます。

編集:

ここで解決策を見つけたようです: http://btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html

ポイントは、ベースアドレスのホスト名を * 記号 (ワイルドカード) に置き換えることです。実行時に実際のホスト名に変更されます。

まだすべてをテストしていませんが、実際に機能しているようです。

4

2 に答える 2

6

ここで解決策を見つけたようです:http://btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html

ポイントは、ベースアドレスのホスト名を「*」記号(ワイルドカード)に置き換えることです。実行時に実際のホスト名に変更されます。

それをテストし、それはうまくいきました。

于 2012-05-21T06:10:33.590 に答える
2

現在、サービス エンドポイント アドレスは次のとおりです。

net.tcp://jerrycan:8000/service

もちろん、サービスをホストしているコンピューター(jerrycan-pc)にクライアントを作成すると、ローカルクライアントは参照することでサービスにアクセスできます

net.tcp://localhost:8000/service

また、明らかに他のクライアント (ネットワーク上の他のコンピューター上)は、 localhostに接続しようとしてもサービスに接続できません。これは、 endpoint:が、この場合はサービスをホストしていないローカル コンピューターを呼び出しているためです (jerrycan-pc の場合のみ)。 )。がサービスをホストしている場合、 のクライアントはを参照してサービスを呼び出すことができますが、 のクライアントはまたはの IPを呼び出そうとする必要があります。サービス構成のエンドポイントをサービス ホスト IP またはコンピューター名に変更し、サービス ホスト/コンピューター名の IP を使用して他のコンピューターでサービスを参照すると、サービスにアクセスできるようになります。たとえば、jerrycan-pc がサービスをホストしていて、その IP がnet.tcp://localhost:8000/servicejerrycan-pcjerrycan-pclocalhostmike-pcjerrycan-pcjerrycan-pc192.168.1.5、クライアントはこのエンドポイントを参照してサービスを利用できます:

net.tcp://192.168.1.5:8000/service

そのため、サービス構成localhostで IP アドレスまたは PC 名に変更し、クライアントで に連絡する代わりにそのアドレスに連絡してみてくださいlocalhost

于 2012-05-18T09:18:09.337 に答える