2009-02-10 3 views
46

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

Коммуникационный объект 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) 

ответ

60
+1

спасибо! я попытался без использования инструкции тоже ... без успеха :( – Perpetualcoder

+7

Я написал некоторый код оболочки, который помогает с использованием WCF + с использованием проблемы с блоком http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/ ФОС-communicationobjectfaultedexception-Quot-не может-быть использован-для-общений-потому-то-есть-в-нарушенное-состояние-Quot-messagesecurityexception-Quot-ан-ошибки произошли, когда-проверочная-безопасность в наличии the-message-quot.aspx –

+5

Но это IDisposable. «использование» - лучшая практика! –

19

Update:

Это linked answer describes a cleaner, simpler way of doing the same thing with C# syntax.


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

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

Более подробно см: Expected Exceptions

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

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

+0

Следующий вопрос о SO перечисляет исключения и рекомендации по их обработке: http://stackoverflow.com/questions/6130331/how-to-handle-wcf-exceptions-consolidated-list-with-code – LamonteCristo

5

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

+0

Эта проблема сложно! Вы решили это для меня и пощадили меня несколько часов. Спасибо – graumanoz

+0

Ничего себе .. кто-то дает этому человеку оскар! – Murphybro2

1

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

0

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

/Root/{Name}/{Name}