Domanda

sto ottenendo questa eccezione:

  

L'oggetto di comunicazione,   System.ServiceModel.Channels.ServiceChannel,   non può essere utilizzato per la comunicazione   perché è in stato di errore.

Il servizio WCF utilizza il wsHttpBinding di default. Sto usando WCF nel modo seguente ovunque io sto usando:

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

La linea di errore mostrato nel messaggio sembra essere dopo l'ultima proxy.close. Non so cosa sta succedendo. Sto lanciando il servizio all'interno di Visual Studio 08.

Ecco le informazioni di traccia:

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)

Altri suggerimenti


Aggiorna :

risposta

legata descrive un pulitore, modo più semplice di fare la stessa cosa con la sintassi C #.


Original post

Questo è il modo di Microsoft raccomanda di gestire le chiamate client WCF:

Per maggiori dettagli si veda: eccezioni attesi

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

Ulteriori informazioni

Così molte persone sembrano essere questa domanda su WCF che Microsoft ha creato anche un campione dedicato per dimostrare come gestire le eccezioni:

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

Scaricare l'esempio: C # o VB

Considerando che ci sono così tanti problemi che coinvolgono l'istruzione using , (riscaldata?) discussioni interne e discussioni su questo tema, io non ho intenzione di sprecare il mio tempo a cercare di diventare un cowboy di codice e trovare un modo più pulito. Mi limiterò a succhiare in su, e implementare i clienti WCF questa verbosa (ancora attendibile) modo per le mie applicazioni server.

Se la modalità di trasferimento è Buffered , quindi fare in modo che i valori di MaxReceivedMessageSize e MaxBufferSize è stesso . Ho appena risolto il problema dello stato in errore in questo modo dopo alle prese con lui per ore e ho pensato che vi posterò qui se aiuta qualcuno.

Questo errore può anche essere causata dalla presenza di zero metodi contrassegnate con l'attributo OperationContract. Questo era il mio problema quando si costruisce un nuovo servizio e testarlo a lungo la strada.

Simile alla risposta di Ryan Rodemoyer, ho scoperto che quando l'UriTemplate concernente il contratto non è valido si può ottenere questo errore. Nel mio caso, ho usato lo stesso parametro due volte. Ad esempio:

/Root/{Name}/{Name}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top