Як програмно підключити клієнта до послуги WCF?


74

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

Як мені робити це?


1
Для всіх , хто шукає цей план, погляньте на цей відповідь: stackoverflow.com/a/839941/592732
MarioVW

Відповіді:


113

Вам доведеться використовувати клас ChannelFactory .

Ось приклад:

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

Супутні ресурси:


4
Щиро дякую. Крім того, ось як отримати об’єкт IMyService для використання у вашому додатку: msdn.microsoft.com/en-us/library/ms733133.aspx
Андрій

Ви повинні кинути , clientщоб IClientClientдля того , щоб закрити його , хоча.
Dyppl

У своєму прикладі я припускаю, що IMyServiceінтерфейс успадковується від System.ServiceModel.ICommunicationObject . Я змінив зразок коду, щоб зробити це зрозумілішим.
Енріко Кампідоліо,

Питання @EnricoCampidoglio: чи доводиться відтворювати канал кожного разу, коли потрібно зателефонувати, чи можна зберігати службу IService у глобальних змінних для повторного використання на всьому протязі? Коли я тестую своє з'єднання за допомогою цього методу, він працює, але потім, якщо я спробую виконати виклик окремим методом, я отримую помилку "немає кінцевої точки прослуховування"?
MaxOvrdrv

2
Я поєднав це з цією відповіддю і чудово працює. Дякую
JumpingJezza

8

Ви також можете робити те, що робить згенерований код "Посилання на послуги"

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");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.