Клиентское представление WCF - PullRequest
5 голосов
/ 30 июля 2009

У меня есть класс контроллера mvc, который использует службу WCF (WSHttpBinding), иногда несколько вызовов в рамках одного запроса http, и хочу знать, как дорого создать клиент для этой службы. Можно ли создавать экземпляр клиента для каждого вызова или мне следует создать переменную-член в классе?

public class RingbacksController : Controller
{
    private void LoadContactsIntoViewData(int page)
    {
                RingbackServiceClient client = new RingbackServiceClient();
        ...
        client.Close();
    }

    private void LoadGroupsIntoViewData(int page)
    {
                RingbackServiceClient client = new RingbackServiceClient();
        ...
        client.Close();
    }
}

или

public class RingbacksController : Controller
{
    private RingbackServiceClient client = new RingbackServiceClient();

    private void LoadContactsIntoViewData(int page)
        {
        ...
        client.Close();
    }

    private void LoadGroupsIntoViewData(int page)
    {
        ...
        client.Close();
    }
}

Ответы [ 3 ]

3 голосов
/ 30 июля 2009

Создание клиента, как правило, не очень дорогая операция, поэтому вы должны прекрасно его создавать, когда вам это нужно (как уже упоминал Стивен - если он неисправен из-за ошибки, вам все равно придется это сделать).

Если вы используете ChannelFactory для создания канала (это один из способов сделать это), то создание ChannelFactory, с другой стороны, является довольно тяжелой и трудоемкой операцией, поэтому было бы хорошей идеей повесить как можно дольше на экземпляр ChannelFactory.

Марк

2 голосов
/ 14 августа 2009

В прошлом я создавал новый экземпляр ChannelFactory <> и client / proxy для каждого вызова службы WCF. У меня не было никаких проблем с этим, особенно в отношении производительности. Написанное мною приложение было развернуто во внутренней сети компании (локальной сети), где около 30 клиентов Windows Forms подключались к моей службе WCF.

Посмотрите на следующий вопрос Где перехватить неудачное соединение в классе вызова WCF? и мой ответ на него. По сути, это класс-оболочка, который обрабатывает создание экземпляров клиент / прокси и выполняет множество необходимых обработок ошибок, чтобы преодолеть определенные недостатки в дизайне WCF (подробнее в связанном вопросе).

Вы можете переписать или обернуть его на другой фабрике, чтобы вы могли кэшировать ChannelFactory и клиент / прокси, если вы беспокоитесь о производительности. Я «слышал», что кешировать ChannelFactory или клиент / прокси - плохая идея, однако я открыт для исправления.

1 голос
/ 30 июля 2009

Если вы решите пойти с участником, имейте в виду, что, как только он выйдет из строя, все последующие вызовы не будут выполнены. Что касается того, стоит ли это того, я предлагаю сравнительный анализ.

...