12 ответов:
вы получаете эту ошибку, потому что вы допустили исключение .NET на своей стороне сервера, и вы не поймали и не обработали его, и не преобразовали его в ошибку SOAP.
теперь, когда серверная сторона "разбомблена", среда выполнения WCF" сбила " канал - например, канал связи между клиентом и сервером непригоден для использования - в конце концов, похоже, что ваш сервер просто взорвался, поэтому вы больше не можете общаться с ним.
Итак, что вам нужно сделать это:
всегда поймать и обрабатывать ошибки на стороне сервера -не пусть исключения .NET перемещаются с сервера на клиент -всегда оберните их в совместимые ошибки SOAP. Проверьте WCF IErrorHandler интерфейс и реализовать его на стороне сервера
Если вы собираетесь отправить второе сообщение на ваш канал от клиента, убедитесь, что канал не в неисправное состояние:
if(client.InnerChannel.State != System.ServiceModel.CommunicationState.Faulted) { // call service - everything's fine } else { // channel faulted - re-create your client and then try again }Если это так, все, что вы можете сделать, это избавиться от него и снова создать прокси-сервер на стороне клиента, а затем повторите попытку
чтобы предотвратить попадание сервера в состояние сбоя, вы должны убедиться, что не возникает необработанное исключение. Если WCF видит неожиданное исключение, больше не принимаются вызовы-безопасность в первую очередь.
Две возможности избежать такого поведения:
используйте исключение FaultException (это не является неожиданным для WCF, поэтому WCF знает, что сервер все еще имеет допустимое состояние)
вместоthrow new Exception("Error xy in my function")всегда
throw new FaultException("Error xy in my function")возможно ты можешь попробовать..поймать весь блок и бросить FaultException во всех случаях исключения
try { ... some code here } catch (Exception ex) { throw new FaultException(ex.Message) }скажите WCF обрабатывать все исключения с помощью Errorhandler. Это можно сделать несколькими способами, я выбрал простой, используя атрибут:
Все, что нам нужно сделать больше, это использовать атрибут[SvcErrorHandlerBehaviour]о реализации желаемого сервисаusing System; using System.Collections.ObjectModel; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace MainService.Services { /// <summary> /// Provides FaultExceptions for all Methods Calls of a Service that fails with an Exception /// </summary> public class SvcErrorHandlerBehaviourAttribute : Attribute, IServiceBehavior { public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } //implementation not needed public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { } //implementation not needed public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcherBase chanDispBase in serviceHostBase.ChannelDispatchers) { ChannelDispatcher channelDispatcher = chanDispBase as ChannelDispatcher; if (channelDispatcher == null) continue; channelDispatcher.ErrorHandlers.Add(new SvcErrorHandler()); } } } public class SvcErrorHandler: IErrorHandler { public bool HandleError(Exception error) { //You can log th message if you want. return true; } public void ProvideFault(Exception error, MessageVersion version, ref Message msg) { if (error is FaultException) return; FaultException faultException = new FaultException(error.Message); MessageFault messageFault = faultException.CreateMessageFault(); msg = Message.CreateMessage(version, messageFault, faultException.Action); } } }это простой пример, вы можете погрузиться глубже в IErrorhandler, не используя голый
FaultException, аFaultException<>С типом, который предоставляет дополнительную информацию смотрите IErrorHandler для детального примера.
на самом деле, если неудачно после следующих предложений от marc_s, пожалуйста, имейте в виду, что элемент
в конфигурации привязки сервера (или его отсутствие) в web.config на сервере может вызвать это исключение. Например, сервер ожидает Message-уровень безопасности и клиент настроен наNone(или, если сервер не является частью домена Active Directory, но удаленный хост клиента).совет: в таких случаях клиентское приложение, скорее всего, вызовет штраф веб-службы при выполнении непосредственно на сервере под учетной записью администратора в сеансе RDP.
прикрепить к the
faultedсобытие выяснить, почему и когда произошла ошибка.Edit: также было бы полезно, если бы вы опубликовали дополнительную информацию о том, что вы делаете.
чтобы диагностировать эту проблему, запустите службу в отладчике Visual Studio. Используйте меню: Debug / Exceptions и укажите, что вы хотите прервать при возникновении исключения.
исходное исключение будет иметь гораздо лучшее сообщение об ошибке, чем "..он находится в неисправном состоянии."
например, я получал это исключение из ServiceHost.Open (), но когда я поймал исходное исключение в то время, когда оно было брошено, сообщение об ошибке было:
сервис 'MyServiceName' имеет нулевое приложение (без инфраструктуры) конечная точка. Это может быть связано с тем, что файл конфигурации не найден для вашего приложения или потому, что ни один элемент службы не соответствует имя службы можно найти в файле конфигурации, или потому что нет конечные точки были определены в элементе сервиса.
исправление орфографической ошибки в приложении.конфиг решил проблему.
У меня есть веб-клиент, который подключается к службе Windows через WCF. мое веб-приложение выдает ту же ошибку
Объект связи, система.Средство servicemodel.Каналы.ServiceChannel нельзя использовать для связи, потому что он находится в состоянии faulted Я включил трассировку WCF, что не очень помогло. наконец, перезапуск службы windows разрешил его, и у меня все еще есть понятия не имею о причинах. поэтому устранение неполадок должно как всегда начинаться с простого. Это случай в пункте. если у кого-то есть подобная проблема, попробуйте перезапустить услуга.
У меня была еще одна проблема, что я не думаю, что были упомянуты в других ответах.
Я должен обслуживать конечные точки на том же tcp-адресе и Порту. В приложении.config, я забыл добавить обе конечные точки, поэтому служба работала на правильном Порту, но с неправильным интерфейсом службы.
Если вы видите это сообщение в Debug from Visual Studio и решение содержит проект WCF. Затем откройте эти параметры проекта WCF - > перейдите на вкладку" Параметры WCF "- > выкл. " запуск узла службы WCF при отладке..."вариант
в моем случае причиной был какой-то неправильный сертификат, который не может быть загружен. Я узнал об этом из просмотра событий в разделе Система:
при попытке доступа к серверу TLS произошла фатальная ошибка закрытый ключ учетных данных. Код ошибки, возвращенный из криптографического модуль-0x8009030D. состояние внутренней ошибки-10001.
эта ошибка может быть вызвана вашим собственным компьютером тоже, а не только необработанное исключение. Если ваш сервер / компьютер имеет свое время на часах слишком много минут, многие веб-службы .NET отклонят ваш запрос с необработанной ошибкой. Это обрабатывается с их точки зрения, но не обрабатывается с вашей точки зрения. Убедитесь, что часы вашего принимающего сервера установлены правильно. Если он должен быть исправлен, вам придется сбросить свой сервис или перезагрузиться до повторного открытия канала.
I испытал эту проблему на сервере, где брандмауэр заблокировал обновление времени интернета, и сервер по какой-то причине отключился. Все сторонние веб-службы .NET вошли в ошибку, потому что они отклонили любой запрос веб-службы. Копание в средстве просмотра событий помогло определить проблему, но настройка часов решила ее. Ошибка была на нашем конце, хотя мы получили сообщение об ошибке Faulted State для будущих вызовов веб-службы.
сервер автоматически прерывает соединения, по которым не было получено ни одного сообщения в течение времени, равного таймауту приема (по умолчанию-10 мин.). Это-смягчение DoS, чтобы предотвратить клиентов от принуждения сервера иметь открытые соединения в течение неопределенного количества времени.
Так как сервер прерывает соединение, потому что он простаивает, клиент получает это исключение.
вы можете контролировать, как долго сервер допускает подключение чтобы перейти в режим ожидания, прежде чем прервать его, настроив тайм-аут получения на привязке сервера. Кредит: T. R. Vishwanath-MSFT
Не решение этой проблемы, но если вы испытываете вышеуказанную ошибку с Ektron eSync, это может быть то, что ваша база данных исчерпала дисковое пространство.
Edit: на самом деле это не совсем проблема Ektron eSync. Это может произойти на любой службе, которая запрашивает полную базу данных.
изменить: из дискового пространства, или блокировка доступа к каталогу, который вам нужен вызовет эту проблему.
Comments