Wie verbinde ich einen Client programmgesteuert mit einem WCF-Dienst?

74

Ich versuche, eine Anwendung (den Client) mit einem exponierten WCF-Dienst zu verbinden, jedoch nicht über die Anwendungskonfigurationsdatei, sondern im Code.

Wie soll ich das machen?

Andrei
quelle
1
Für alle, die dies suchen, werfen Sie einen Blick auf diese Antwort: stackoverflow.com/a/839941/592732
MarioVW

Antworten:

113

Sie müssen die ChannelFactory- Klasse verwenden.

Hier ist ein Beispiel:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("http://localhost/myservice");
using (var myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint))
{
    IMyService client = null;

    try
    {
        client = myChannelFactory.CreateChannel();
        client.MyServiceOperation();
        ((ICommunicationObject)client).Close();
        myChannelFactory.Close();
    }
    catch
    {
        (client as ICommunicationObject)?.Abort();
    }
}

Ähnliche Resourcen:

Enrico Campidoglio
quelle
4
Vielen Dank. Außerdem erfahren Sie, wie Sie das IMyService-Objekt in Ihrer Anwendung verwenden können: msdn.microsoft.com/en-us/library/ms733133.aspx
Andrei,
Sie sollten auf werfen client, IClientClientum es zu schließen.
Dyppl
In meinem Beispiel gehe ich davon aus, dass die IMyServiceSchnittstelle von System.ServiceModel.ICommunicationObject erbt . Ich habe den Beispielcode geändert, um dies klarer zu machen.
Enrico Campidoglio
@EnricoCampidoglio Frage: Müssen Sie den Kanal jedes Mal neu erstellen, wenn Sie einen Anruf tätigen möchten, oder können Sie den IService in globalen Variablen speichern, um ihn durchgehend wiederzuverwenden? Wenn ich meine Verbindung mit dieser Methode teste, funktioniert es, aber später, wenn ich versuche, einen Aufruf in einer separaten Methode auszuführen, erhalte ich den Fehler "Kein Endpunkt hören"?
MaxOvrdrv
2
Ich habe dies mit dieser Antwort kombiniert und funktioniert großartig. Danke
JumpingJezza
8

Sie können auch das tun, was der generierte Code "Service Reference" tut

public class ServiceXClient : ClientBase<IServiceX>, IServiceX
{
    public ServiceXClient() { }

    public ServiceXClient(string endpointConfigurationName) :
        base(endpointConfigurationName) { }

    public ServiceXClient(string endpointConfigurationName, string remoteAddress) :
        base(endpointConfigurationName, remoteAddress) { }

    public ServiceXClient(string endpointConfigurationName, EndpointAddress remoteAddress) :
        base(endpointConfigurationName, remoteAddress) { }

    public ServiceXClient(Binding binding, EndpointAddress remoteAddress) :
        base(binding, remoteAddress) { }

    public bool ServiceXWork(string data, string otherParam)
    {
        return base.Channel.ServiceXWork(data, otherParam);
    }
}

Wobei IServiceX Ihr WCF-Servicevertrag ist

Dann Ihr Kundencode:

var client = new ServiceXClient(new WSHttpBinding(SecurityMode.None), new EndpointAddress("http://localhost:911"));
client.ServiceXWork("data param", "otherParam param");
joseph.l.hunsaker
quelle