Comment s’assurer que vous n’obtenez pas d’exception d’état WCF Faulted?

Je reçois cette exception:

L’object de communication, System.ServiceModel.Channels.ServiceChannel, ne peut pas être utilisé pour la communication car il est dans l’état Faulted.

Le service WCF utilise le paramètre par défaut wsHttpBinding. J’utilise WCF de la manière suivante partout où je l’utilise:

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

La ligne d’erreur affichée dans le message semble être après le dernier proxy.close. Pas sûr de ce qui se passe. Je lance le service depuis le studio visuel 08.

Voici les informations de trace:

 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) 

Vous devriez éviter de mettre des proxys clients en using blocs.


Mise à jour :

Cette réponse liée décrit un moyen plus simple et plus simple de faire la même chose avec la syntaxe C #.


Poste d’origine

C’est la méthode recommandée par Microsoft pour gérer les appels des clients WCF:

Pour plus de détails, voir: Exceptions attendues

 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(); } 

Information additionnelle

Tant de personnes semblent poser cette question sur WCF que Microsoft a même créé un exemple dédié pour montrer comment gérer les exceptions:

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

Télécharger l’échantillon: C # ou VB

Considérant qu’il y a tellement de problèmes concernant l’utilisation de l’énoncé , (chauffé?) Discussions internes et discussions sur cette question, je ne vais pas perdre mon temps à essayer de devenir un cow-boy de code et à trouver un moyen plus propre. Je vais juste le sucer et implémenter les clients WCF de cette manière verbeuse (mais fiable) pour mes applications serveur.

Si le mode de transfert est mis en mémoire tampon, assurez-vous que les valeurs de MaxReceivedMessageSize et MaxBufferSize sont identiques . Je me suis contenté de résoudre le problème de l’état défectueux de cette façon après avoir lutté pendant des heures et je pensais le poster ici si cela pouvait aider quelqu’un.

Cette erreur peut également être provoquée par l’absence de méthodes marquées avec l’atsortingbut OperationContract. C’était mon problème lors de la construction d’un nouveau service et de le tester longtemps.

Semblable à la réponse de Ryan Rodemoyer, j’ai constaté que lorsque le UriTemplate sur le contrat n’est pas valide, vous pouvez obtenir cette erreur. Dans mon cas, j’utilisais deux fois le même paramètre. Par exemple:

 /Root/{Name}/{Name}