Что противоположно ChannelFactory <TChannel>.CreateChannel? - PullRequest
0 голосов
/ 19 декабря 2011

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

Похоже, есть ограничение на количество каналов, которые я могу открыть одновременно. Но так как канал является экземпляром пользовательского объекта, я не вижу, как я могу закрыть его или уничтожить или что мне нужно с ним сделать, чтобы избавиться от него, чтобы я мог создавать другие каналы.

Затем я заметил в CreateChannel документации , что мой TChannel должен реализовывать IChannel (чего не делает учебник, на который я ссылался выше). Итак, вот так я бы закрыл свой канал? Если да, то как мне его закрыть или что мне делать с реализацией метода Close? И что мне делать с реализацией любого другого метода, если мне нужно реализовать интерфейс?

Или я должен просто использовать один канал, пока он длится? В любом случае, как мне узнать, является ли он неисправным, открытым или закрытым, если все, что у меня есть, - это экземпляр моего класса?

Как видите, я довольно растерялся в этом вопросе, поэтому я надеюсь, что вы можете указать мне правильное направление.

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011

ChannelFactory<TChannel>.CreateChannel создает и возвращает канал указанного вами типа услуги. Возвращенный объект уже реализует IChannel. Вам (обычно?) Не нужно реализовывать свой собственный метод Close или любые другие методы IChannel.

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

Вы можете закрыть канал, переведя его на IClientChannel. Используйте этот шаблон:

try
{
  ((IClientChannel)channel).Close();
}
catch (Exception ex)
{
  ((IClientChannel)channel).Abort();
}

Вы можете использовать ((IClientChannel)channel).State, чтобы получить состояние канала (т.е. CreatedOpened, Faulted, Closed).

1 голос
/ 19 декабря 2011

Пеладао в основном бьет ногтем по голове.

Чтобы пояснить некоторые из его слов, CreateChannel создаст (прокси) объект, который реализует как пользовательский интерфейс службы , так и IClientChannel.

Обычно вы держите канал открытым и повторно используете его вызовы. Также следует помнить, что после входа в состояние сбоя восстановление невозможно, необходимо открыть новый канал. Как упоминает Пеладао, состояние ошибки может быть обнаружено по каналу ((IClientChannel)) .State, а также не забывайте, что вы, как правило, тоже получаете исключение.

Если память используется, процесс отладки для WCF принимает 10 одновременных каналов для службы.

...