2010-08-24 7 views
7

У меня есть много веб-сервисов, работающих в моем проекте, но что-то странное происходит довольно долгое время. Мои службы иногда вылетают без причины с сообщением об ошибке «Объект связи System.ServiceModel.Channels.ServiceChannel не может использоваться для связи, потому что он находится в состоянии Faulted». Обычно это происходит, когда я запускаю приложение первым делом с утра, после чего они встречаются реже. Любые идеи относительно того, что может вызвать эту ошибку?WCF в состоянии сбойных служб

+0

Вы пробовали трассировку WCF? –

+0

Эта ошибка исходит из кода, использующего службу WCF, или из самой службы? –

+0

@Ladislav: Нет, еще нет. Я не слишком уверен в трассировке WCF. Не хорошие учебники, чтобы начать меня? @Graham: Это в основном происходит из кода, использующего службу WCF. – Farax

ответ

5

Это звучит как тайм-аут в сочетании с отсутствием обслуживания неудачных сервисов.

Утром требуется больше времени, так как код должен быть скомпилирован JIT, возможно, также необходимо кэшировать данные и планы запросов.

Вот один из способов получить клиент WCF, чтобы убирать за собой http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/wcf-communicationobjectfaultedexception-quot-cannot-be-used-for-communication-because-it-is-in-the-faulted-state-quot-messagesecurityexception-quot-an-error-occurred-when-verifying-security-for-the-message-quot.aspx

+0

, но я не использую «использование "блоков. – Farax

+0

Вам все равно придется закрыть службу после того, как вы ее использовали, и вам нужно отменить службу, если она находится в состоянии сбоя. –

+0

Действительно, после удаления моего блока USING я мог видеть реальную ошибку. 10x –

9

Если служба WCF бросает FaultException, клиент будет иметь его состояние изменяется на CommunicationState.Faulted. Если вы попробуете использовать этот объект клиента, чтобы вызвать другую операцию службы, вы получите ошибку

«Коммуникационный объект System.ServiceModel.Channels.ServiceChannel, не может быть использован для связи , потому что он находится в состоянии Faulted. "

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

Вы можете проверить состояние своего объекта-клиента, указав свойство State. Если вы хотите закрыть своего клиента правильно (что вы должны делать), вам нужно вызвать метод Abort(), если клиент находится в состоянии Faulted и метод Close(), если клиент находится в любом другом состоянии.

+0

Вид поражения цели 'use', не так ли? WCF никогда не перестает удивлять меня, насколько это плохо спроектировано. –

Смежные вопросы