Как убедиться, что вы не получаете исключение состояния Faf WCF? - PullRequest
49 голосов
/ 10 февраля 2009

Я получаю это исключение:

Объект связи, System.ServiceModel.Channels.ServiceChannel, не может быть использован для общения потому что он находится в состоянии неисправности.

Служба WCF использует wsHttpBinding по умолчанию. Я использую WCF следующим образом везде, где я его использую:

using (var proxy = new CAGDashboardServiceClient())
{
    proxy.Open();
    var result = proxy.GetSiteForRegion(ddlRegions.SelectedValue);
    ddlSites.DataSource = result;
    ddlSites.DataBind();
    proxy.Close();
}

Строка с ошибкой, показанная в сообщении, похоже, следует за последним proxy.close. Не уверен что происходит. Я запускаю сервис из визуальной студии 08.

Вот информация о трассировке:

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Server stack trace: 
  at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)

Exception rethrown at [0]: 
  at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
  at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
  at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.Close()
  at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
  at CAGDashboard.UserControls.ucVolunteerCRUDGrid.ddlRegions_SelectedIndexChanged(Object sender, EventArgs e) in C:\Documents and Settings\rballalx\My Documents\Visual Studio 2008\Projects\DashboardCAG\CAGDashboard\UserControls\ucVolunteerCRUDGrid.ascx.cs:line 81
  at System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
  at System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
  at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
  at System.Web.UI.Page.RaiseChangedEvents()
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Ответы [ 5 ]

65 голосов
/ 10 февраля 2009
20 голосов
/ 19 февраля 2011

Обновление

Этот связанный ответ описывает более простой и понятный способ сделать то же самое с синтаксисом C #.


Оригинальный пост

Это рекомендуемый Microsoft способ обработки вызовов клиента WCF:

Подробнее см .: Ожидаемые исключения

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

Дополнительная информация

Похоже, что так много людей задают этот вопрос на WCF, что Microsoft даже создала специальный образец, чтобы продемонстрировать, как обрабатывать исключения:

C: \ WF_WCF_Samples \ WCF \ Basic \ Client \ ExpectedExceptions \ CS \ клиент

Скачать образец: C # или VB

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

5 голосов
/ 24 апреля 2014

Если режим передачи Буферизован , убедитесь, что значения MaxReceivedMessageSize и MaxBufferSize равны , то же самое . Я только что решил проблему сбойного состояния таким образом после нескольких часов борьбы с ним и подумал, что опубликую его здесь, если это кому-нибудь поможет.

1 голос
/ 21 апреля 2015

Эта ошибка также может быть вызвана тем, что нулевые методы помечены атрибутом OperationContract. Это было моей проблемой при создании нового сервиса и его долгом тестировании.

0 голосов
/ 13 апреля 2016

Аналогично ответу Райана Родемойера, я обнаружил, что когда UriTemplate в Контракте недействителен, вы можете получить эту ошибку. В моем случае я использовал один и тот же параметр дважды. Например:

/Root/{Name}/{Name}
...