19 votes

WCF ne peut pas être utilisé pour la communication parce qu'il est dans l'état Faulted.

Lorsque j'essaie d'utiliser un webservice, j'obtiens l'exception suivante. Ma principale question est la suivante : quand cette exception se produit-elle ? sur le serveur ou le client ? où se trouve l'erreur ? Le serveur lève-t-il cette exception pour un large éventail d'erreurs ?

J'ai fait quelques changements par moi-même qui semblent fonctionner.

Ça marche maintenant. J'ai supprimé l'utilisation et ajouté un nettoyage sur le client de service.

if (Service != null && Service.State != CommunicationState.Faulted)
                {
                    success = true;
                    Service.Close();
                }

            }
            catch (Exception ex)
            {
                msg = "Error" + Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace;
            }
            finally{
                if (!success)
                {
                    if (Service != null) Service.Abort();
                }
            }

C'était l'exception :

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 bNet.Services.Customers.Cres.Helios.ServiceForm.Send(ServiceFormAction task) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Services\Customers\Cres\Helios\ServiceForm.cs:line 99
at bNet.Web.Sites.Public.Customers.Cres.ServiceSkjema.Units.Page.ServiceFormControl.SubmitFormClick(Object sender, EventArgs e) in C:\bNetProjects\bNet Web Tools\Solution root\bNet.Web.Sites.Public\Customers\Cres\ServiceSkjema\Units\Page\ServiceFormControl.ascx.cs:line 192
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

18voto

Henk Holterman Points 153608

L'état de défaillance signifie qu'il y a eu un inattendu exception du côté du serveur. Dans un appel précédent.

Vous auriez dû obtenir une exception du côté client également, peut-être votre code l'ignore-t-il ?

Vous pouvez le résoudre en rouvrant la connexion. Mais il semble que vous ayez besoin d'une meilleure gestion des erreurs.

9voto

Zac Points 1273

Au lieu de cela, d'utiliser le using essayez d'exécuter votre code sans cette déclaration.

De

using(var client = new WCFClient())
{
    // ... code
}

à

var client = new WCFClient()

// ... code

En faisant cela, nous avons pu voir que l'original WCF ne peut pas être utilisé pour la communication parce qu'il est dans l'état Faulted. a été causé par le using() l'appel lui-même. Pourquoi ? Notre code qui utilisait le client WCF passait des informations d'identification invalides, et le serveur répondait par une erreur et changeait l'état du proxy en défaut. Le site using() bloc, comme nous le savons appels Dispose() sur l'objet - dans ce cas notre client WCF.

Puisque le client de WCF a échoué, et le client de WCF était dans un état de défaut, appelant Dispose() a provoqué l'erreur WCF ne peut pas être utilisé pour la communication parce qu'il est dans l'état Faulted. pour être jeté.

Nous avons pu voir cela en enveloppant le code qui utilise le client WCF dans un fichier de type try...catch bloc.

2voto

Ryan Rodemoyer Points 1798

Cette erreur peut également être causée par l'absence de méthodes marquées avec l'attribut OperationContract. C'est le problème que j'ai rencontré lorsque j'ai créé un nouveau service et que je l'ai testé pendant un long moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X