wake-up-neo.com

Wie kann sichergestellt werden, dass keine WCF-Fehlerzustandsausnahme auftritt?

Ich erhalte diese Ausnahme:

Das Kommunikationsobjekt System.ServiceModel.Channels.ServiceChannel kann nicht für die Kommunikation verwendet werden, da es sich im Status Fehler befindet.

Der WCF-Dienst verwendet die Standardeinstellung wsHttpBinding. Wo immer ich WCF verwende, verwende ich es auf folgende Weise:

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

Die in der Nachricht angezeigte Fehlerzeile scheint nach dem letzten proxy.close zu stehen. Ich bin nicht sicher, was los ist. Ich starte den Dienst in Visual Studio 08.

Hier sind die Trace-Informationen:

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

Update :

Diese verknüpfte Antwort beschreibt eine übersichtlichere und einfachere Möglichkeit, dasselbe mit der C # -Syntax zu tun.


Originalbeitrag

Dies ist die von Microsoft empfohlene Methode zum Behandeln von WCF-Clientaufrufen:

Weitere Einzelheiten finden Sie unter: Erwartete Ausnahmen

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

Zusätzliche Informationen

So viele Leute scheinen diese Frage in WCF zu stellen, dass Microsoft sogar ein spezielles Beispiel erstellt hat, um zu demonstrieren, wie mit Ausnahmen umgegangen wird:

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

Laden Sie das Beispiel herunter: C # oder VB

In Anbetracht der Tatsache, dass es so viele Probleme gibt einschließlich der using-Anweisung , (hitzig?) Interne Diskussionen und Threads zu diesem Thema gehe ich nicht Verschwenden Sie meine Zeit damit, ein Code-Cowboy zu werden und einen saubereren Weg zu finden. Ich werde es einfach aufsaugen und WCF-Clients so ausführlich (und dennoch vertrauenswürdig) für meine Serveranwendungen implementieren.

20

Wenn der Übertragungsmodus gepuffert ist, stellen Sie sicher, dass die Werte von MaxReceivedMessageSize und MaxBufferSizegleich sind. Ich habe gerade das Problem mit dem fehlerhaften Zustand auf diese Weise behoben, nachdem ich mich stundenlang damit auseinandergesetzt hatte, und dachte, ich werde es hier posten, wenn es jemandem hilft.

5
Nishant

Ähnlich wie bei Ryan Rodemoyers Antwort stellte ich fest, dass dieser Fehler auftreten kann, wenn die UriTemplate im Vertrag ungültig ist. In meinem Fall habe ich denselben Parameter zweimal verwendet. Beispielsweise:

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