Dynamisch eingestellte Endpunktadresse im wcf-Client (mit Netto-TCP-Bindung)

Daher bin ich mit WCF nicht allzu vertraut und all die Dinge, die ich gegoogelt habe, haben mir nicht dabei geholfen, das zu erreichen, was ich brauche. Sorry wenn das eine blöde Frage ist :)

Grundsätzlich gibt es eine Server-App mit Diensten, die mit WCF (Net TCP Binding) verfügbar gemacht werden. Ich habe eine neue Konsolen-App geschrieben und muss den Service anrufen. Ich kann dies also erreichen, indem ich eine DLL für unser Proxy-Projekt hinzufüge und eine Reihe von Konfigurationsdateien (wie WCFClientBindings, WCFClientEndPoints) hinzufüge. Wenn ich einen definierten Endpunkt verwende, kann ich folgenden Code aufrufen:

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

Die App soll jedoch den Hostnamen aufrufen können, der als Befehlszeilenargument übergeben wird.

Also, während meine App mit einem definierten Endpunkt arbeitet:

<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>

Ich muss in der Lage sein, den localhost-Hostnamen zu aktualisieren, um möglicherweise etwas anderes zu sein. Hoffe, dass die Sicherheit mich nicht aus der Ruhe bringt :)

Die Beispiele, die ich gesehen habe, scheinen den Client / Proxy zu instanziieren, indem sie die "dynamische" Bindung und Adresse übergeben, aber unsere Proxy-Klasse akzeptiert diese nicht. Gibt es keine Möglichkeit, die Adresse des Endpunkts (zur Laufzeit) vor dem Aufrufen der "Proxy" -Klasse zu aktualisieren? Die einzigen anderen Beispiele, die ich gesehen habe, betrafen die Instantiierung eines neuen ServiceHost - aber das klingt für den Kunden nicht sehr passend :)

Vielen Dank!

Bearbeiten - OK, hier ist die Syntax, die gut zu funktionieren scheint. Es ist ein bisschen anders als die Antwort, die ich akzeptiert habe, aber dieser Ansatz war der richtige Weg :)

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();
        }

Antworten auf die Frage(1)

Ihre Antwort auf die Frage