2011-12-19 8 views
0

Я только что последовал за this учебником и немного поиграл с кодом. Я почти уверен, что я где-то читал, что есть тайм-аут для канала, поэтому он может автоматически закрыться. Поэтому я попробовал просто открыть новый канал в моем клиенте для каждого метода, который я хотел вызвать, и в итоге (после множества вызовов) у меня появились ошибки.Что противоположно ChannelFactory <TChannel> .CreateChannel?

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

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

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

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

ответ

5

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

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

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

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

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

+0

Спасибо, что я попробую позже, так как я сейчас аф. В любом случае, как вы узнаете этот материал? Не удается найти много информации о документации. Я не хочу спрашивать, когда-либо думает, что я делаю. Это то, что вы можете найти в книгах? – Juan

+0

Я использую несколько источников, которые я нашел с течением времени через поисковые запросы, такие как CodeProject.com, MSDN, dotnetconsult.co.uk. И, конечно, самый большой источник всего ...StackOverflow;) – Peladao

+0

Это будет работать. Я проверю этот dotnetconsult один. – Juan

1

Peladao в основном поражает гвоздь на голове.

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

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

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