2008-08-24 28 views
6

J'ai un service Web WCF qui est référencé à partir d'une bibliothèque de classes. Une fois le projet est exécuté, lors de la création de l'objet client de service à l'intérieur d'une bibliothèque de classes, je reçois un InvalidOperationException avec le message:InvalidOperationException lors de la création de l'instance de service Web wcf

Impossible de trouver l'élément de point final par défaut qui fait référence à un contrat « MyServiceReference.IMyService » dans le client ServiceModel section de configuration. Cela peut être dû au fait qu'aucun fichier de configuration n'a été trouvé pour votre application, ou parce qu'aucun élément de point de terminaison correspondant à ce contrat n'a pu être trouvé dans l'élément client.

Le code que je utilise pour créer l'instance est:

myServiceClient = new MyServiceClient(); 

où MyServiceClient hérite de

System.ServiceModel.ClientBase

Comment puis-je résoudre ce problème?

Remarque: J'ai une application de console séparée qui crée simplement le même objet de service et effectue des appels et fonctionne sans problème.

Répondre

5

Voici mon fichier app.config de la bibliothèque de classes:

Vous devez mettre ces paramètres de configuration dans le fichier de configuration de l'application principale. L'application .NET (qui appelle votre bibliothèque de classes) utilise les données de son propre fichier de configuration et non celles du fichier de configuration de votre bibliothèque.

+3

Où est votre app.config? – iamserious

0

Il serait probablement utile si vous avez posté votre fichier app.config, car ce type d'erreur tend à indiquer un problème dans le bloc <endpoint>. Assurez-vous que l'attribut du contrat vous semble correct.

Éditer: Essayez de qualifier pleinement la valeur de votre contrat; utiliser l'espace de noms complet. Je pense que c'est nécessaire.

1

J'avais un cas similaire. J'avais une bibliothèque de classes qui appelait un service web, puis j'avais un .EXE qui appelait le fichier .DLL de la classe-lib. Je pense que c'est le fichier de configuration du .EXE qui est utilisé et non celui de la config .DLL. Mais comme Richard l'a dit plus haut, j'ai dû qualifier complètement l'espace de noms. C'est un peu pénible. Ci-dessous est exactement ce que j'ai changé. La douleur est que j'ai dû le changer à deux endroits, l'un dans le fichier reference.cs qui est généré lorsque vous créez une référence de service, et l'autre dans le fichier de configuration. Ainsi, chaque fois que je change le service Web et que je fais une «mise à jour de référence», je dois à nouveau modifier le code C#.

1) Vous devez réellement changer la ConfigurationName dans les reference.cs comme suit:

De: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = " RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]

Pour: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = "TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]

2), puis modifiez également la valeur « contrat » dans tous app.config connexes (pour .dll et.EXE) comme suit:

De:

< adresse de noeud final = http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc liaison = "wsHttpBinding" bindingConfiguration = "WSHttpBinding_ITwoWayAsync" contrat = "RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations" name = "WSHttpBinding_ITwoWayAsync" >

Destinataire:

< adresse de point de terminaison = http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc = liaison "wsHttpBinding" bindingConfiguration = "WSHttpBinding_ITwoWayAsync" contrat = "TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations" name = "WSHttpBinding_ITwoWayAsync" >

Juste pour être clair - comment ai-je savoir ce que l'espace de noms complet était? L'espace de noms du programme était TFBIC.RCT.HIP. A l'intérieur qui, le code C# a une déclaration d'espace de noms supplémentaire:

namespace RCTHipComponents 
8

Ou vous pouvez définir le point final dans votre code:

http://msdn.microsoft.com/en-us/library/ms731862.aspx

BasicHttpBinding binding = new BasicHttpBinding(); 
EndpointAddress address = new EndpointAddress("http://url-to-service/"); 

// Create a client that is configured with this address and binding. 
MyServiceClient client = new MyServiceClient(binding, address);