3

そのため、私はWCFにあまり精通しておらず、グーグルで検索したすべてのものが、必要なものを実現する方法を教えてくれませんでした。これがばかげた質問ならごめんなさい:)

基本的に、WCF(ネットtcpバインディング)で公開されたサービスを備えたサーバーアプリがあります。新しいコンソールアプリを作成しました。サービスを呼び出す必要があります。したがって、これは、使用しているプロキシプロジェクトのdllを追加し、一連の構成ファイル(WCFClientBindings、WCFClientEndPointsなど)を追加することで実現できます。定義されたエンドポイントを使用する場合、次のようなコードを呼び出すことができます。

using (var partyProxy = new PartyControllerProxy())
            {
                // execute server method 
                partyProfile = partyProxy.GetLatestPartyProfile(context, parsedParameters.PartyId);
            }

ただし、アプリは、コマンドライン引数として渡されたホスト名を呼び出すことができるはずです。

したがって、私のアプリは定義されたエンドポイントで動作しますが、次のようになります。

<client>
  <endpoint
  name="IPartyControllerEndpoint"
  address="net.tcp://localhost:46000/ServiceInterface/PartyController.svc"
  binding="customBinding" bindingConfiguration="DefaultNetTcpBindingConfiguration"
  contract="CompanyA.Service.Product.Core.Contracts.IPartyController"
  behaviorConfiguration="DefaultEndpointBehavior">
  </endpoint>
</client>

ローカルホストのホスト名を更新して、他の可能性があるようにする必要があります。セキュリティが私をつまずかせないことを望んでいます:)

私が見た例は、「動的」バインディングとアドレスを渡すことによってクライアント/プロキシをインスタンス化するように見えますが、プロキシクラスはそれらを受け入れません。「プロキシ」クラスを呼び出す前に(実行時に)エンドポイントのアドレスを更新する方法はありませんか?私が見た他の唯一の例は、新しいServiceHostのインスタンス化に関係していますが、それはクライアントにとってあまり適切ではないようです:)

ありがとう!

編集-OKこれがうまく機能しているように見える構文です。私が受け入れた答えとは少し異なりますが、そのアプローチが進むべき道でした:)

using (ChannelFactory<IPartyController> factory = new ChannelFactory<IPartyController>("IPartyControllerEndpoint"))
        {
            EndpointAddress address = new EndpointAddress(String.Format("net.tcp://{0}/ServiceInterface/PartyController.svc", parsedParameters.HostName));
            IPartyController channel = factory.CreateChannel(address);

            partyProfile = channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
            ((IClientChannel)channel).Close();
        }
4

1 に答える 1

5

ChannelFactory を作成できます。

標準のクライアントに加えて、WCF WSDL はクライアント用のインターフェイス クラスも提供します。

EndpointAddress address = new EndpointAddress("http://dynamic.address.here");
        using (ChannelFactory<IPartyControllerChannel> factory = new ChannelFactory<IPartyControllerChannel>("IPartyControllerEndpoint", address))
        {

            using (IPartyControllerChannel channel = factory.CreateChannel())
            {
                channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
            }
        }
于 2012-08-31T06:22:32.907 に答える