2009-03-31 13 views
94

Qualche idea su come risolvere questo problema?Errore WCF - Impossibile trovare l'elemento endpoint predefinito che fa riferimento al contratto "UserService.UserService"

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 elemento endpoint predefinito che fa riferimento a 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 che corrisponda a questo contratto nell'elemento client.

Risolto!

Non ho detto che questa era un'applicazione Silverlight. Ho avuto il riferimento wcf in una DLL che aveva il proprio file "ServiceReferences.ClientConfig". Ho spostato il contenuto del ServiceReferences.ClientConfig della DLL nel principale progetto Silverlight e ha funzionato.

+0

e se l'applicazione che esegue la DLL è di terze parti, ad es. la DLL è un plugin per un'altra applicazione? –

risposta

183

Ho avuto una corsa con 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 degli 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.

+49

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

+5

Sembra che questo sia vero per qualsiasi tipo di progetto, stavo usando quartz.net come servizio Windows e avevo un lavoro su un altro assembly 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

2

Avete un'interfaccia che la vostra classe "UserService" implementa.

gli endpoint devono specificare un'interfaccia per l'attributo del contratto:

contract="UserService.IUserService" 
1

Non sono sicuro se questo è un problema. Endpoint e binding hanno entrambi lo stesso nome

1

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

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

Marc

4

Modificare il web.config del servizio WCF come "indirizzo dell'endpoint =" "binding = "basicHttpBinding" ..." (in precedenza vincolante = "wsHttpBinding") Dopo costruire l'applicazione, in "ServiceReferences. "Configurazione" di ClientConfig ha il valore. Quindi funzionerà bene.

12

Solo nel caso in cui qualcuno colpisce lo stesso problema durante l'utilizzo WPF (piuttosto che WCF o Silverlight):

ho avuto questo errore, quando si collega 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 DAL-layer più sensata, avrebbe gettato l'eccezione.

Impossibile trovare l'elemento 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 che corrisponda a questo contratto nell'elemento client.

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

Per le applicazioni WPF, questo significa che la copia del tag dal app.config nella mia soluzione DAL al app.config nella soluzione principale WPF Application.

+0

questo è ottimo, ma sarebbe meglio 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 visualizzati come un solo paragrafo lungo. Per una risposta di 5 paragrafi come la mia, ciò avrebbe comportato un paragrafo lungo, illeggibile e poco amichevole. Scrivere una risposta separata mi ha permesso di dare una risposta più chiara, che è più probabile che aiuti gli altri utenti (il che, ammettiamolo, è il punto di siti come questo) –

+0

Sì, è una buona ragione, immagino. – sprite

3

Rinominare l'output.config prodotto da svcutil.exe in app.config. ha funzionato per me.

+0

risolto il mio problema. – NVM

-2

Nel caso in cui si utilizza l'applicazione WPF utilizzando il framework PRISM quindi configurazione dovrebbe esistere nella vostra start up del progetto (ad esempio nel progetto in cui risiede il programma di avvio automatico.)

Insomma basta rimuoverlo dalla libreria di classi e mettere in un progetto di start up.

40

È inoltre possibile impostare questi valori in modo programmatico nella libreria di classi, in modo da evitare spostamenti non necessari dei file di configurazione nella libreria. Il codice di esempio per la semplice BasciHttpBinding è -

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

Funziona bene! ;) – wooncherk

+0

@wooncherk, la mia libreria di classi ha solo un riferimento a un wsdl. Dove dovrei inserire questo codice? Lo costruisco in una C# dll e inserisco la DLL nei miei file app, dove faccio riferimento ad IronPython. Grazie –

6

Ho incontrato lo stesso problema, per qualsiasi ragione Visual Studio non ha aggiornato la configurazione web quando ho aggiunto il servizio. Ho riscontrato che l'aggiornamento del Service Reference risolve anche questo problema.

Passi:

  1. passare alla cartella Service Reference
  2. espanderlo
  3. destro del mouse e selezionare aggiornamento Servizio di riferimento
  4. Osservare Config web aggiornato
+0

Sì, questo ha fatto il trucco per me. Sto usando un riferimento al servizio wsdl di terze parti e ho ricevuto questo errore fino a quando ho aggiornato il riferimento al servizio – ejhost

+0

anche per me. Era ovvio dal momento che funziona bene e improvvisamente no. Potrei aver apportato una modifica e non aggiornare il riferimento del servizio. – ehh

0

Questo problema occures quando usi il tuo servizio tramite altra applicazione. Se l'applicazione ha un file di configurazione, aggiungi il tuo servizio di configurazione inf ormazione a questo file. Nella mia situazione non c'era alcun file di configurazione, quindi uso questa tecnica e ha funzionato bene. Ho appena archiviato l'indirizzo URL nell'applicazione, lo ho letto e usando il metodo BasicHttpBinding() lo invio all'applicazione di servizio come parametro. Questa è una semplice dimostrazione di come ha fatto:

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

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

0

Per coloro che lavorano con AX 2012 AIF servizi e cercare di chiamare ci C# o progetto VB all'interno AX (x ++) e soffrono di tali errori di "non poteva trovare endpoint di default" ... o "Nessun contratto trovato" ... tornare al progetto di Visual Studio (C#) e aggiungere queste righe prima di definire il client di servizio, quindi distribuire il progetto e riavviare il client AXE e riprovare: Nota, l'esempio è per Adattatore NetTcp, si potrebbe facilmente utilizzare qualsiasi altro adattatore in base alle proprie 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); 
Problemi correlati