Erreur WCF - Impossible de trouver l'élément de point de terminaison par défaut qui référence le contrat «UserService.UserService»

98

Une idée de comment réparer ça?

UserService.UserServiceClient userServiceClient = new UserServiceClient();
            userServiceClient.GetUsersCompleted += new EventHandler<GetUsersCompletedEventArgs>(userServiceClient_GetUsersCompleted);
            userServiceClient.GetUsersAsync(searchString);

.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_UserService" 
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:52185/UserService.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_UserService" 
                  contract="UserService.UserService"
                  name="BasicHttpBinding_UserService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Shell.Silverlight.Web.Service3Behavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Shell.Silverlight.Web.Service3Behavior" 
                 name="Shell.Silverlight.Web.Service3">
            <endpoint address="" 
                      binding="basicHttpBinding" 
                      contract="Shell.Silverlight.Web.Service3" />
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

Impossible de trouver l'élément de point de terminaison par défaut qui référence le contrat «UserService.UserService» 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.

Résolu!

Je n'ai pas mentionné qu'il s'agissait d'une application Silverlight. J'avais la référence wcf dans une DLL qui avait son propre fichier "ServiceReferences.ClientConfig". J'ai déplacé le contenu de ServiceReferences.ClientConfig de la DLL vers le projet silverlight principal et cela a fonctionné.

NotDan
la source
et si l'application exécutant la DLL est tierce, par exemple la DLL est un plugin pour une autre application?
Stefanos Kargas

Réponses:

186

J'ai eu une course avec le même problème. Mon application était également une application Silverlight et le service était appelé à partir d'une bibliothèque de classes avec un UserControl personnalisé qui y était utilisé.

La solution est simple. Copiez les définitions de point de terminaison du fichier de configuration (par exemple ServiceReferences.ClientConfig) de la bibliothèque de classes dans le fichier de configuration de l'application silverlight. Je sais que vous vous attendez à ce que cela fonctionne sans avoir à faire cela, mais apparemment, quelqu'un à Redmond a pris des vacances ce jour-là.

lutin
la source
50
Cette solution est également valable pour les projets ASP.NET et MVC. Si vous ajoutez le service à une bibliothèque de classes, cela ne fonctionnera pas, récupérez la section system.serviceModel du app.config dans votre projet de bibliothèque et placez-le dans votre web.config.
Adam Pope
5
Il semble que cela soit vrai pour tout type de projet, j'utilisais quartz.net comme service Windows et j'avais un travail sur un assemblage différent qui faisait référence au service Web. Cela a fonctionné pour moi aussi. THX.
thiagoleite
2
Salut, cela a également fonctionné pour un projet Windows Phone. Comme le dit @thiagoleite, il semble que cela fonctionne pour la plupart des types de projets.
Thanushka
3
+1 pour la blague de vacances de Redmond ... Quoi qu'il en soit, y a-t-il un moyen de l'ajouter en tant que fichier externe au lieu de jouer avec le web.config?
Shimmy Weitzhandler
1
@sprite J'ai fini par définir mes paramètres requis dans le code (j'ai remplacé le constructeur client), comme la réponse de Vishal . De cette façon, il est expédié entre les assemblys. Merci!
Shimmy Weitzhandler
45

Vous pouvez également définir ces valeurs par programme dans la bibliothèque de classes, cela évitera un déplacement inutile des fichiers de configuration dans la bibliothèque. L'exemple de code pour BasciHttpBinding simple est -

BasicHttpBinding basicHttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basicHttpbinding.Name = "BasicHttpBinding_YourName";
basicHttpbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
basicHttpbinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

EndpointAddress endpointAddress = new EndpointAddress("http://<Your machine>/Service1/Service1.svc");
Service1Client proxyClient = new Service1Client(basicHttpbinding,endpointAddress);
Vishal
la source
@wooncherk, ma bibliothèque de classes a juste une référence à un wsdl. Où dois-je mettre ce code? Je le construis dans une dll C # et mets la dll dans mes fichiers d'application, où je la référence à partir d'IronPython. Merci
Срба
12

Juste au cas où quelqu'un rencontre le même problème en utilisant WPF (plutôt que WCF ou Silverlight):

J'ai eu cette erreur lors de la connexion à un service Web. Quand mon code était dans la solution WPF Application "principale", pas de problème, cela fonctionnait parfaitement. Mais lorsque j'ai déplacé le code vers la solution de couche DAL la plus sensible, cela lèverait l'exception.

Impossible de trouver l'élément de point de terminaison par défaut qui référence le contrat «MyWebService.MyServiceSoap» 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.

Comme indiqué par "Sprite" dans ce fil, vous devez copier manuellement la balise.

Pour les applications WPF, cela signifie copier la balise de app.config dans ma solution DAL vers app.config dans la solution d'application WPF principale.

Mike Gledhill
la source
c'est génial, mais ce serait mieux comme un bref commentaire sous ma propre réponse, tout comme "Adam Pope" l'a fait. Il serait lu par beaucoup plus de gens.
sprite
2
@sprite: J'aurais ajouté un commentaire, mais les commentaires StackOverflow sont toujours affichés comme un seul long paragraphe. Pour une réponse de 5 paragraphes comme la mienne, cela aurait abouti à un long paragraphe illisible et inamical. Écrire une réponse distincte m'a permis de donner une réponse plus claire, ce qui est plus susceptible d'aider les autres utilisateurs (ce qui, avouons-le, est le but de sites Web comme celui-ci)
Mike Gledhill
6

J'ai rencontré le même problème, quelle qu'en soit la raison, Visual Studio n'a pas mis à jour la configuration Web lorsque j'ai ajouté le service pour la première fois. J'ai trouvé que la mise à jour de la référence de service a également résolu ce problème.

Pas:

  1. Accédez au dossier de référence de service
  2. Développez-le
  3. Cliquez avec le bouton droit et sélectionnez la référence du service de mise à jour
  4. Observez la mise à jour de Web Config
Dale C
la source
Oui, cela a fait l'affaire pour moi. J'utilise une référence de service wsdl tierce et j'obtiens cette erreur jusqu'à ce que je
mette à
Pour moi aussi. C'était évident car cela fonctionne bien et du coup pas. J'ai peut-être apporté une modification et n'ai pas mis à jour la référence du service.
ehh
4

Modifiez le fichier web.config du service WCF en tant que "endpoint address =" "binding =" basicHttpBinding "..." (précédemment binding = "wsHttpBinding") Après avoir généré l'application, dans "ServiceReferences.ClientConfig" "" configuration> a la valeur . Ensuite, cela fonctionnera très bien.


la source
3

Renommez le fichier output.config produit par svcutil.exe en app.config. cela a fonctionné pour moi.

ssilas
la source
2

Avez-vous une interface que votre classe "UserService" implémente.

Vos points de terminaison doivent spécifier une interface pour l'attribut de contrat:

contract="UserService.IUserService"
Nick Josevski
la source
1

Je ne sais pas si c'est un problème. Le point de terminaison et la liaison ont tous deux le même nom

david valentine
la source
1

Je ne sais pas si c'est vraiment un problème, mais je vois que vous avez le même nom pour votre configuration de liaison ().

J'essaie généralement d'appeler mes points de terminaison quelque chose comme "UserServiceBasicHttp" ou quelque chose de similaire (le "Binding" n'a vraiment rien à faire ici), et j'essaie d'appeler mes configurations de liaison quelque chose avec ".... Configuration", par exemple "UserServiceDefaultBinding", pour éviter tout conflit de nom potentiel.

Marc

marc_s
la source
0

J'ai dû ajouter le service dans le fichier App.config appelant pour qu'il fonctionne. Assurez-vous que vous, mais après tout. Cela semblait fonctionner pour moi.

Jackstine
la source
0

Ce problème se produit lorsque vous utilisez votre service via une autre application.Si l'application a un fichier de configuration, ajoutez simplement les informations de configuration de votre service à ce fichier. Dans ma situation, il n'y avait pas de fichier de configuration, donc j'utilise cette technique et cela a fonctionné bien.Juste stocker l'adresse url dans l'application, la lire et en utilisant la méthode BasicHttpBinding (), l'envoyer à l'application de service en tant que paramètre.C'est une simple démonstration de comment j'ai fait il:

Configuration config = new Configuration(dataRowSet[0]["ServiceUrl"].ToString());

var remoteAddress = new System.ServiceModel.EndpointAddress(config.Url);


SimpleService.PayPointSoapClient client = 
    new SimpleService.PayPointSoapClient(new System.ServiceModel.BasicHttpBinding(), 
    remoteAddress);
SimpleService.AccountcredResponse response = client.AccountCred(request);
Suleymani Tural
la source
0

Pour ceux qui travaillent avec les services AX 2012 AIF et essaient d'y appeler un projet C # ou VB dans AX (x ++) et souffrent de telles erreurs de "impossible de trouver le point de terminaison par défaut" ... ou "aucun contrat trouvé" ... retour à votre projet visual studio (c #) et ajoutez ces lignes avant de définir votre client de service, puis déployez le projet et redémarrez le client AX et réessayez: Remarque, l'exemple est pour l' adaptateur NetTcp , vous pouvez facilement utiliser n'importe quel autre adaptateur à la place selon vos besoins .

 Uri Address = new Uri("net.tcp://your-server:Port>/DynamicsAx/Services/your-port-name");
 NetTcpBinding Binding = new NetTcpBinding();
 EndpointAddress EndPointAddr = new EndpointAddress(Address);
 SalesOrderServiceClient Client = new SalesOrderServiceClient(Binding, EndPointAddr);
Boody
la source
-2

Dans le cas où vous utilisez une application WPF utilisant le framework PRISM, la configuration doit exister dans votre projet de démarrage (c'est-à-dire dans le projet où réside votre programme de démarrage.)

En bref, supprimez-le simplement de la bibliothèque de classes et mettez-le dans un projet de démarrage.

VRK
la source