2009-02-10 6 views
46

sto ottenendo questa eccezione:Come assicurarsi di non ottenere un'eccezione di stato Fault Faultata?

L'oggetto di comunicazione, System.ServiceModel.Channels.ServiceChannel, non può essere utilizzato per la comunicazione perché è in stato di errore.

Il servizio WCF utilizza il valore predefinito wsHttpBinding. Sto usando WCF nel modo seguente ovunque io sto usando:

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

La linea di errore mostrato nel messaggio sembra essere dopo l'ultima proxy.close. Non sono sicuro di cosa sta succedendo. Sto lanciando il servizio all'interno di Visual Studio 08.

Ecco le informazioni di traccia:

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) 

risposta

60
+1

grazie !! ho provato senza usare anche la dichiarazione ... senza successo :( – Perpetualcoder

+7

Ho scritto un codice wrapper che aiuta con il WCF + usando il problema del blocco http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/ wcf-CommunicationObjectFaultedException-quot-non può-essere-usato-per-comunicazione-perché-è-in-the-guasto-state-quot-messagesecurityexception-quot-an-error-occurred-quando-verifica-sicurezza-per- the-message-quot.aspx –

+5

Ma è IDisposable. "using" è la migliore pratica! –

19

Aggiornamento:

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


Original post

questo è il modo di Microsoft raccomanda di gestire client WCF chiama:

Per maggiori dettagli si veda: 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(); 
} 

Ulteriori informazioni

Tanti la gente sembra chiedere questo problema zione su WCF che Microsoft anche creato un campione dedicato per dimostrare come gestire le eccezioni:

c: \ WF_WCF_Samples \ WCF \ base \ Client \ ExpectedExceptions CS \ client \

Scaricare l'esempio: C# o VB

Considerando che ci sono così tanti problemi involving the using statement, (heated?) Internal discussions e threads su questo argomento, non ho intenzione di sprecare il mio tempo cercando di diventare un cowboy del codice e trovare un modo più pulito. Mi limiterò a succhiarlo e ad implementare i client WCF questo modo verboso (ma attendibile) per le mie applicazioni server.

+0

La seguente domanda su SO elenca le eccezioni e le migliori pratiche su come gestirli: http://stackoverflow.com/questions/6130331/how-to-handle-wcf-exceptions-consolidated-list-with-code – LamonteCristo

5

Se la modalità di trasferimento è Buffered quindi assicurarsi che i valori di MaxReceivedMessageSize e MaxBufferSize è stesso. Ho appena risolto il problema dello stato di errore in questo modo dopo averlo affrontato per ore e ho pensato di postarlo qui se aiuta qualcuno.

+0

Questo problema è difficile! L'hai risolto per me e mi hai risparmiato poche ore. Grazie – graumanoz

+0

Wow .. qualcuno ha dato a quest'uomo un oscar !! – Murphybro2

1

Questo errore può anche essere causato dall'avere zero metodi contrassegnati con l'attributo OperationContract. Questo è stato il mio problema quando ho creato un nuovo servizio e lo ho testato a lungo.

0

Simile alla risposta di Ryan Rodemoyer, ho scoperto che quando UriTemplate sul contratto non è valido è possibile ottenere questo errore. Nel mio caso, stavo usando lo stesso parametro due volte. Ad esempio:

/Root/{Name}/{Name} 
Problemi correlati