Служба WCF и лучшие практики, связанные с клиентами и методы открытия / закрытия - PullRequest
2 голосов
/ 04 октября 2011

Имея службу WCF и Потребителя, я не совсем уверен, как обращаться с методами Open и Close и временем жизни моего Клиента.

Я сам создал клиент, расширяя и внедряя ClientBase и IMyService.Давайте назовем его MyServiceClient

Например, я использую его в одном месте - MembershipProvider.Поэтому я предоставил MembershipProvider MyClient в качестве переменной-члена.

Я хотел бы, чтобы он был один раз создан в MembershipProvider (через контейнер IoC), а затем, возможно, выполнял бы вызовы Open и Close внутри каждого вызова метода в клиенте.1007 *

    public bool ValidateUser(string username, string password)
    {
        this.Open();
        bool b = Channel.ValidateUser(username, password);
        this.Close();
        return b;
    }

Это правильный путь.Я не очень понимаю, что на самом деле происходит, когда вызывается open / close, и как один экземпляр клиента влияет на сервис (если вообще).

1 Ответ

4 голосов
/ 04 октября 2011

Одна из проблем, связанных с использованием одного экземпляра клиента (прокси-сервера WCF), заключается в том, что при возникновении сбоя прокси-сервер переходит в состояние Failed и не может быть повторно использован или Dispose-d, только Abort-ed. и создал заново. С другой стороны, если вы используете / требуете сеансов на стороне службы, вам нужен один и тот же экземпляр прокси для нескольких вызовов.

В любом случае, если вы хотите использовать прокси сейчас и потом беспокоиться о транспорте, сеансах или сбоях, я предлагаю такую ​​обертку, которую я использую для моих прокси WCF:

TResult ExecuteServiceMethod<TResult>(Func<MyService, TResult> method)
{
    var proxy = new MyService(); //...Or reuse an existing if not faulted
    try
    {        
        return method(proxy);
    }
    catch(Exception e)
    {
        //...Handle exceptions
    }
    finally
    {
        //...Per-call cleanup, for example proxy.Abort() if faulted...
    }
}

и вы называете свои методы обслуживания следующим образом:

var result = ExecuteServiceMethod((MyService s) => s.VerifyUser(username, password));

Замените MyService вашим действительным типом клиента. Таким образом, вы можете позже изменить свою стратегию открытия / закрытия / повторного использования, добавить ведение журнала и т. Д. Для всех вызовов службы, добавив код до или после строки return method(client).

...