web-dev-qa-db-fra.com

Comment être sûr de ne pas obtenir d'exception d'état WCF Faulted?

Je reçois cette exception:

L'objet de communication, System.ServiceModel.Channels.ServiceChannel, ne peut pas être utilisé pour la communication car il est à l'état Défaillé.

Le service WCF utilise le wsHttpBinding par défaut. 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 se trouver après le dernier proxy.close. Pas sûr de ce qui se passe. Je lance le service depuis Visual Studio 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)
49
Perpetualcoder
65
Brian

Mise à jour :

Cette la réponse liée décrit une manière plus simple et plus propre de faire la même chose avec la syntaxe C #.


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

Informations supplémentaires

Tant de gens 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échargez l'exemple: C # ou VB

Étant donné qu'il y a tellement de problèmes impliquant l'instruction using , (chauffé?) Discussions internes et threads sur cette question, je ne vais pas de perdre mon temps à essayer de devenir un cow-boy de code et de trouver un moyen plus propre. Je vais simplement le sucer et implémenter les clients WCF de cette manière détaillée (mais fiable) pour mes applications serveur.

20
goodguys_activate

Si le mode de transfert est Buffered alors assurez-vous que les valeurs de MaxReceivedMessageSize et MaxBufferSize sont idem. Je viens de résoudre le problème d'état défectueux de cette façon après l'avoir lutté pendant des heures et j'ai pensé que je le posterais ici si cela aide quelqu'un.

5
Nishant

Cette erreur peut également être provoquée par le fait que zéro méthode est balisée avec l'attribut OperationContract. C'était mon problème lors de la création d'un nouveau service et de son test sur le long terme.

1
Ryan Rodemoyer

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

/Root/{Name}/{Name}
0
Gil Milow