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

StackOverflow https://stackoverflow.com/questions/530731

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Объект связи, 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.Не уверен что происходит.Я запускаю сервис из 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)
Это было полезно?

Другие советы


Обновлять:

Этот связанный ответ описывает более чистый и простой способ сделать то же самое с синтаксисом 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\client

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

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

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

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

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

/Root/{Name}/{Name}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top