Как убедиться, что вы не получите исключение из состояния Faulted WCF? - программирование
Подтвердить что ты не робот

Как убедиться, что вы не получите исключение из состояния Faulted WCF?

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

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

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

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

Строка ошибки, показанная в сообщении, кажется, после последнего прокси. close. Не уверен что происходит. Я запускаю сервис из visual studio 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)
4b9b3361

Ответ 2


Обновление

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


Оригинальное сообщение

Это рекомендуемый 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\клиент

Загрузите образец: С# или VB

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

/Root/{Name}/{Name}