378 votes

Impossible de trouver l'élément de point de terminaison par défaut

J'ai ajouté un proxy à un webservice dans une solution VS2008/.NET 3.5. Lors de la construction du client, .NET génère cette erreur :

Impossible de trouver l'élément endpoint par défaut qui fait référence au contrat 'IMySOAPWebService' dans la section de configuration du client ServiceModel. Cela peut être dû au fait qu'aucun fichier de configuration n'a été trouvé pour votre application ou qu'aucun élément de point de terminaison correspondant à ce contrat n'a pu être trouvé dans l'élément client.

La recherche de cette erreur me dit d'utiliser l'espace de noms complet dans le contrat. Voici mon app.config avec l'espace de noms complet :

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

J'utilise XP local (je le mentionne car un certain nombre de résultats de Google mentionnent win2k3). L'app.config est copié dans app.exe.config, donc ce n'est pas non plus le problème.

Des indices ?

0 votes

Si le système fonctionne sur un serveur web, vous devez ajouter .svc. Exemple : " 192.168.100.87:7001/soap/IMySOAPWebService.svc

0 votes

Le service n'est pas un service .NET, il ne fonctionne pas sur un serveur web.

0 votes

J'ai résolu ce problème dans des projets développés en .NET, mais j'ai quelques projets en VB6 et j'ai le même problème. Avez-vous une idée ?

605voto

L.R. Points 3359

"Cette erreur peut survenir si vous appelez le service dans une bibliothèque de classes et que vous appelez la bibliothèque de classes depuis un autre projet."

Dans ce cas, vous devrez inclure les paramètres de configuration de WS dans le fichier app.config du projet principal s'il s'agit d'une application Windows ou web.config s'il s'agit d'une application Web. C'est la méthode à suivre, même avec PRISM et WPF/Silverlight.

1 votes

Ce n'était pas la cause de mon problème spécifique, mais je suis sûr que cela aidera d'autres personnes. Merci

9 votes

Existe-t-il un moyen de fusionner automatiquement les deux ? Que se passe-t-il si la bibliothèque de classes met à jour sa configuration ? Faut-il simplement se souvenir de mettre à jour les informations de configuration copiées dans tous les projets qui y font référence ? Cette solution semble trop dépendre de la vigilance du développeur...

1 votes

J'obtiens la même erreur pour une application WP7 (Silverlight je crois) et j'ai mis beaucoup trop de temps à m'en rendre compte. ServiceReferences.ClientConfig est généré dans le répertoire du projet. La copie du <bindings> et <client> des éléments du fichier dans ma bibliothèque vers mon application principale (qui étaient auparavant vides) ont permis de faire fonctionner les choses.

93voto

Tom Haigh Points 32314

J'ai résolu ce problème (comme d'autres l'ont peut-être suggéré) en créant moi-même les instances de liaison et d'adresse de point de terminaison - parce que je ne voulais pas ajouter de nouveaux paramètres aux fichiers de configuration (il s'agit du remplacement d'un code de bibliothèque existant qui est largement utilisé, et qui utilisait auparavant une ancienne référence de service Web, etc.

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

Modifier

Si vous utilisez https alors vous devez utiliser BasicHttpsBinding plutôt que BasicHttpBinding .

1 votes

Cette réponse est utile. Sur un service Web que j'utilise, le point de terminaison personnalisé doit être lié dans la déclaration initiale de l'objet. Cela n'aurait pas fonctionné si j'avais essayé de le faire plus tard.

2 votes

Même si je soupçonne que la première réponse aurait pu faire l'affaire aussi, votre solution a fonctionné, et elle me semble préférable à celle qui consiste à bricoler mes propres fichiers de configuration.

0 votes

Ça marche du tonnerre ! Je préfère de loin pouvoir définir le point de terminaison dans le code plutôt que de distribuer un fichier "app.config" avec mon application.

78voto

edosoft Points 7783

Après avoir testé plusieurs options, j'ai finalement résolu le problème en utilisant la méthode suivante

contract="IMySOAPWebService"

c'est-à-dire sans l'espace de nom complet dans la configuration. Pour une raison quelconque, le nom complet n'a pas été résolu correctement.

3 votes

Il semble que le nom du contrat doive être écrit exactement de la même manière que celui du client. Dans mon cas, j'avais var proxy = new ExternalServices.ServiceClient("MyServiceEndpoint"); Cela a fonctionné lorsque j'ai ajouté l'espace de nom au contrat : contract="ExternalServices.IMyService"

0 votes

Cela n'a pas fonctionné pour moi. Mon problème est peut-être un peu différent. J'obtiens cette erreur de temps en temps, mais pas toujours. Quel pourrait être le problème ? L'erreur pourrait-elle être du côté du service ?

59voto

Andomar Points 115404

J'ai eu le même problème. Il s'avère que pour une REFERENCE web, vous devez fournir l'URL comme premier paramètre du constructeur :

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

Pour un nouveau style de SERVICE REFERENCE web, vous devez fournir un nom qui fait référence à une entrée de point de terminaison dans la configuration :

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Avec une entrée correspondante dans Web.config ou App.config :

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

Il est très difficile d'enlever la vision étroite du "ça marchait dans un ancien programme"...

3 votes

Ah ha ! Cela a réglé le problème pour moi, j'utilisais juste un constructeur vide avant, qui échouait toujours : new WebService.WebServiceSoapClient() ; //échec

0 votes

Cette solution a fonctionné ! !! Mais, je suis vraiment curieux de savoir pourquoi le point d'arrivée par défaut n'a pas été chargé ? une idée de ce qui pourrait être la raison ?

0 votes

@Andomar désolé de faire remonter un vieux fil. Est-ce que l'un a un avantage sur l'autre - WebReference et ServiceReference ? Je pense que le premier serait plus pratique pour moi mais ServiceReference est la nouvelle chose cool je suppose...

17voto

Bravo Points 791

J'ai eu une situation comme celle-là, où j'avais

  • Service WCF hébergé quelque part
  • Projet principal
  • Projet consommateur de type 'class Library' qui a une référence de service à un service WCF.
  • Le projet principal appelle des méthodes du projet consommateur

Maintenant, le projet Consumer a tous les paramètres de configuration connexes dans le fichier <system.serviceModel> Tag de mon app.config, la même erreur que celle mentionnée ci-dessus s'est produite.

Tout ce que j'ai fait, c'est ajouter le même tag <system.serviceModel> au fichier app.config de mon projet principal, et enfin nous étions prêts à partir.

Le vrai problème, dans mon cas, était qu'il lisait le mauvais fichier de configuration. Au lieu de l'app.config du consommateur, il se référait à la configuration du projet principal. Il m'a fallu deux heures pour le découvrir.

1 votes

Même. Recherche de <system.serviceModel> dans votre bibliothèque, puis copiez-le dans l'app.config de votre application principale. C'est un symptôme supplémentaire du fait que les app.config des bibliothèques de classes ne sont pas lus au moment de l'exécution. Je passe tellement de temps à compenser cet oubli (imo). Si je veux que la bibliothèque lise sa configuration à partir de son app.config, laissez-la faire. Sinon, pourquoi avoir un app.config pour les bibliothèques de classe en premier lieu ?

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