Question

Je reçois cette exception:

  

L'objet 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 wsHttpBinding par défaut. J'utilise WCF de la façon suivante 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é dans le message semble être après la dernière proxy.close. Pas sûr de ce qui se passe. Je lance le service à partir de 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)

Autres conseils


Mise à jour :

réponse liée décrit un produit de nettoyage, de façon plus simple de faire la même chose avec la syntaxe C #.


Original post

Ceci est la méthode recommandée de Microsoft pour gérer les appels des clients WCF:

Pour plus de détails, voir: Exceptions prévues

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 complémentaires

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

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

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

Considérant qu'il ya tant de problèmes impliquant l'instruction à l'aide , (chauffée?) Les discussions internes et

Si le mode de transfert est Buffered puis assurez-vous que les valeurs de MaxReceivedMessageSize et MaxBufferSize même . Je viens résolu le problème de l'Etat faillé cette façon après grappling avec elle pendant des heures et je pensais que je posterai ici si cela aide quelqu'un.

Cette erreur peut aussi être causée par des méthodes ayant zéro marqués avec l'attribut OperationContract. Ce fut mon problème lors de la construction d'un nouveau service et tester un long chemin.

Dans le même à la réponse de Ryan Rodemoyer, j'ai trouvé que lorsque le 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}
scroll top