Errore WCF: impossibile trovare l'elemento dell'endpoint predefinito che fa riferimento al contratto "UserService.UserService"


98

Qualche idea su come risolvere questo problema?

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>

Impossibile trovare l'elemento dell'endpoint predefinito che fa riferimento al contratto "UserService.UserService" nella sezione di configurazione del client ServiceModel. Ciò potrebbe essere dovuto al fatto che non è stato trovato alcun file di configurazione per l'applicazione o perché non è stato trovato alcun elemento endpoint corrispondente a questo contratto nell'elemento client.

Risolto!

Non ho detto che si trattava di un'applicazione Silverlight. Avevo il riferimento wcf in una DLL che aveva il proprio file "ServiceReferences.ClientConfig". Ho spostato il contenuto di ServiceReferences.ClientConfig della DLL nel progetto Silverlight principale e ha funzionato.


cosa succede se l'applicazione che esegue la DLL è di terze parti, ad esempio la DLL è un plugin per un'altra applicazione?
Stefanos Kargas

Risposte:


186

Ho avuto lo stesso problema. La mia applicazione era anche un'applicazione Silverlight e il servizio veniva chiamato da una libreria di classi con un UserControl personalizzato che veniva utilizzato al suo interno.

La soluzione è semplice. Copiare le definizioni dell'endpoint dal file di configurazione (ad esempio ServiceReferences.ClientConfig) della libreria di classi nel file di configurazione dell'applicazione Silverlight. So che ti aspetteresti che funzioni senza doverlo fare, ma a quanto pare qualcuno a Redmond ha avuto una vacanza quel giorno.


50
Questa soluzione è valida anche per i progetti ASP.NET e MVC. Se aggiungi il servizio a una libreria di classi, non funzionerà, prendi la sezione system.serviceModel da app.config nel tuo progetto di libreria e inseriscilo nel tuo web.config.
Adam Pope l'

5
Sembra che questo sia vero per qualsiasi tipo di progetto, stavo usando quartz.net come servizio Windows e avevo un lavoro su un assembly diverso che faceva riferimento al servizio web. Ha funzionato anche per me. Grazie.
thiagoleite

2
Ciao, ha funzionato anche per un progetto Windows Phone. Come dice @thiagoleite, sembra che funzioni per la maggior parte dei tipi di progetto.
Thanushka

3
+1 per la barzelletta sulle vacanze di Redmond ... Comunque, c'è un modo per aggiungerla come file esterno invece di giocare con il web.config?
Shimmy Weitzhandler

1
@sprite Ho finito per impostare le mie impostazioni richieste nel codice (ho sovrascritto il costruttore del client), come risposta di Vishal . In questo modo viene spedito attraverso gli assembly. Grazie!
Shimmy Weitzhandler

45

È inoltre possibile impostare questi valori in modo programmatico nella libreria di classi, questo eviterà lo spostamento non necessario dei file di configurazione attraverso la libreria. Il codice di esempio per BasciHttpBinding semplice è:

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);

@wooncherk, la mia libreria di classi ha solo un riferimento a un wsdl. Dove devo mettere questo codice? Lo compilo in una dll C # e inserisco la dll nei file della mia app, dove la faccio riferimento da IronPython. Grazie
Срба

12

Nel caso in cui qualcuno riscontri lo stesso problema durante l'utilizzo di WPF (anziché WCF o Silverlight):

Ho riscontrato questo errore durante la connessione a un servizio Web. Quando il mio codice era nella soluzione "principale" dell'applicazione WPF, nessun problema, funzionava perfettamente. Ma quando ho spostato il codice nella soluzione di livello DAL più sensata, avrebbe generato l'eccezione.

Impossibile trovare l'elemento dell'endpoint predefinito che fa riferimento al contratto "MyWebService.MyServiceSoap" nella sezione di configurazione del client ServiceModel. Ciò potrebbe essere dovuto al fatto che non è stato trovato alcun file di configurazione per l'applicazione o perché non è stato trovato alcun elemento endpoint corrispondente a questo contratto nell'elemento client.

Come è stato affermato da "Sprite" in questo thread, è necessario copiare manualmente il tag.

Per le app WPF, ciò significa copiare il tag da app.config nella mia soluzione DAL ad app.config nella soluzione dell'applicazione WPF principale.


questo è fantastico, ma sarebbe meglio come un breve commento sotto la mia risposta, proprio come ha fatto "Adam Pope". Verrebbe letto da molte più persone.
sprite

2
@sprite: avrei aggiunto un commento, ma i commenti StackOverflow vengono sempre mostrati come un unico lungo paragrafo. Per una risposta di 5 paragrafi come la mia, il risultato sarebbe stato un paragrafo lungo, illeggibile e ostile. Scrivere una risposta separata mi ha permesso di dare una risposta più chiara, che è più probabile che aiuti altri utenti (che, ammettiamolo, è il punto di siti web come questo)
Mike Gledhill

6

Ho riscontrato lo stesso problema, per qualsiasi motivo Visual Studio non ha aggiornato la configurazione Web quando ho aggiunto il servizio per la prima volta. Ho scoperto che anche l'aggiornamento del riferimento al servizio ha risolto questo problema.

Passaggi:

  1. Accedi alla cartella di riferimento del servizio
  2. Espandilo
  3. Fare clic con il tasto destro e selezionare Aggiorna riferimento servizio
  4. Osserva che la configurazione web venga aggiornata

Sì, questo ha funzionato per me. Sto utilizzando un riferimento al servizio wsdl di terze parti e ho ricevuto questo errore fino a quando non ho aggiornato il riferimento al servizio
ejhost,

Anche per me. Era ovvio poiché funziona bene e improvvisamente no. Potrei aver apportato una modifica e non ho aggiornato il riferimento del servizio.
ehh

4

Cambia il web.config del servizio WCF come "endpoint address =" "binding =" basicHttpBinding "..." (precedentemente binding = "wsHttpBinding") Dopo aver compilato l'app, in "ServiceReferences.ClientConfig" "" configurazione> ha il valore . Allora funzionerà bene.


3

Rinomina il file output.config prodotto da svcutil.exe in app.config. ha funzionato per me.


2

Hai un'interfaccia implementata dalla tua classe "UserService".

I tuoi endpoint dovrebbero specificare un'interfaccia per l'attributo del contratto:

contract="UserService.IUserService"

1

Non sono sicuro se questo sia un problema. L'endpoint e l'associazione hanno entrambi lo stesso nome


1

Non sono sicuro che sia davvero un problema, ma vedo che hai lo stesso nome per la tua configurazione di associazione ().

Di solito provo a chiamare i miei endpoint qualcosa come "UserServiceBasicHttp" o qualcosa di simile (il "Binding" in realtà non ha nulla a che fare qui), e provo a chiamare le mie configurazioni di binding qualcosa con ".... Configuration", ad es. "UserServiceDefaultBinding", per evitare potenziali conflitti di nome.

Marc


0

Ho dovuto aggiungere il servizio nel file App.config chiamante per farlo funzionare. Assicurati di farlo, ma dopo tutto. Questo sembrava funzionare per me.


0

Questo problema si verifica quando si utilizza il servizio tramite un'altra applicazione. Se l'applicazione ha un file di configurazione, è sufficiente aggiungere le informazioni di configurazione del servizio a questo file. Nella mia situazione non c'era alcun file di configurazione, quindi uso questa tecnica e ha funzionato bene: basta memorizzare l'indirizzo URL nell'applicazione, leggerlo e utilizzando il metodo BasicHttpBinding () inviarlo all'applicazione di servizio come parametro.Questa è una semplice dimostrazione di come ho fatto esso:

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);

0

Per coloro che lavorano con i servizi AIF di AX 2012 e provano a chiamare il progetto C # o VB all'interno di AX (x ++) e soffrono di errori del tipo "impossibile trovare l'endpoint predefinito" ... o "nessun contratto trovato" ... torna indietro al tuo progetto visual studio (c #) e aggiungi queste righe prima di definire il client del servizio, quindi distribuisci il progetto e riavvia il client AX e riprova: Nota, l'esempio è per l'adattatore NetTcp , puoi facilmente utilizzare qualsiasi altro adattatore invece in base alle tue necessità .

 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);

-2

Nel caso in cui si utilizzi l'applicazione WPF utilizzando il framework PRISM, la configurazione dovrebbe esistere nel progetto di avvio (ovvero nel progetto in cui risiede il programma di avvio automatico).

In breve, basta rimuoverlo dalla libreria di classi e inserirlo in un progetto di avvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.