2009-08-31 5 views
1

J'ai créé un service WCF avec wsHttpBinding qui utilise le fournisseur d'appartenance asp.net pour l'authentification. Je peux capable d'héberger le service sur le serveur avec succès. Mais mon problème est wiered. (Je peux voir les fichiers .svc et wsdl dans le navigateur indépendamment du domaine) Je ne peux consommer le service qu'à partir de ma machine ou de toute autre machine dans le même domaine. Si j'essaie d'accéder au service à partir d'un autre domaine via l'application (Windows appl.). Il me donne le message d'erreur: -Problème lors de l'accès au service WCF hébergé sur IIS à partir d'une application Windows

"L'objet de communication, System.ServiceModel.Channels.ServiceChannel, ne peut pas être utilisé pour la communication car il est dans l'état Faulted"

Stack Trace: trace de la pile de serveur : à System.ServiceModel.Channels.CommunicationObject.Close (timeout TimeSpan)

Exception relancée à [0]: à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) au système .Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & MSGDATA, le type Int32) à System.ServiceModel.ICommunicationObject.Close (TimeSpan timeout) 1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) at System.ServiceModel.ClientBase à System.ServiceModel.ClientBase 1.Close() à System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() at AOLICWindows.Forms.SynchronizeTest.btnRegistration_Click (Expéditeur d'objet, EventArgs e)

Répondre

1

wsHttpBinding utilise par défaut les informations d'identification Windows pour l'authentification, ce qui est correct tant que vous êtes sur le même domaine ou sur un domaine avec des relations d'approbation complètes. Le message d'erreur semble pointer vers un délai d'attente - peut-être vous avez besoin de modifier ces. Une fois qu'une exception se produit sur votre serveur qui n'est pas gérée correctement et transformée en erreur SOAP, le canal (la connexion entre le client et le serveur) est "en panne", par ex. il entre dans un état d'erreur et ne peut plus être utilisé. Tout ce que vous pouvez faire est d'annuler le canal (vous ne pouvez même plus le fermer à ce moment-là), et le recréer à partir de rien.

Ou peut-être ce délai d'attente se produit-il parce que vous avez enveloppé l'utilisation de votre proxy client dans un bloc using(......) {......}? C'est généralement une bonne idée - mais pas dans le cas d'un proxy client WCF.

Le problème survient du fait qu'une fois qu'un canal est défaillant, vous ne pouvez même plus le fermer. Si vous intégrez votre utilisation de proxy client dans une instruction using(), lorsque quelque chose se passe mal sur le serveur et n'est pas gérée correctement, le canal est défaillant et à la fin du bloc using(), le runtime .NET essaie de fermer, qui a ensuite lancer une exception puisque la chaîne est en défaut ....

donc, pour les clients WCF, la meilleure pratique recommandée est quelque chose comme ceci:

YourClientProxy proxy = new YourClientProxy(); 

try 
{ 
    ... use it 

    proxy.Close(); 
} 
catch(TimeoutException exception) 
{ 
    proxy.Abort(); 
} 
catch(CommunicationException exception) 
{ 
    proxy.Abort(); 
} 

Marc

+0

Merci, V beaucoup Marc. Cela m'aide à repérer les problèmes réels. –

Questions connexes