2010-05-31 1 views
70

Я пытаюсь подключить приложение (клиент) к открытой службе WCF, но не через файл конфигурации приложения, а в коде.Как программно подключить клиента к службе WCF?

Как мне это сделать?

+1

Для тех, кто в поисках этого вверх, посмотрите на этот ответ: http://stackoverflow.com/a/839941/592732 – MarioVW

ответ

101

Вам необходимо использовать класс ChannelFactory.

Вот пример:

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

IMyService client = null; 

try 
{ 
    client = myChannelFactory.CreateChannel(); 
    client.MyServiceOperation(); 
    ((ICommunicationObject)client).Close(); 
} 
catch 
{ 
    if (client != null) 
    { 
     ((ICommunicationObject)client).Abort(); 
    } 
} 

Близкие по теме ресурсы:

+3

Отлично, спасибо. В качестве дополнения, вот как получить объект IMyService для использования в вашем приложении: http://msdn.microsoft.com/en-us/library/ms733133.aspx – Andrei

+0

Вы должны использовать 'client' для' IClientClient' в чтобы закрыть его, хотя. – Dyppl

+0

В моем примере я предполагаю, что интерфейс IMyService наследуется от [System.ServiceModel.ICommunicationObject] (http://msdn.microsoft.com/en-us/library/system.servicemodel.icommunicationobject.aspx). Я изменил образец кода, чтобы сделать это более понятным. –

6

Вы также можете сделать то, что "Service Reference" сгенерированный код делает

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

Где IServiceX ваш WCF Соглашение о предоставлении услуг

Тогда ваш код клиента:

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