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)
Mise à jour :
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.
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.
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.
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}