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


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:


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");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.