2013-07-11 13 views
12

So che questo è stato picchiato a morte, ma non riesco a farlo funzionare come dovrebbe. Ho un servizio WCF con diversi contratti. Tutti funzionano bene quando li chiamano direttamente, ad es. http://merlin.com/CompanyServices/CompanyWcfService.svc/Get_Document_Dates_Received/223278 Ho usato questo servizio WCF con successo su InfoPath Forms e Nintex Workflow. Ora creo una semplice applicazione ASP.Net, come è stata fatta in http://www.webcodeexpert.com/2013/04/how-to-create-and-consume-wcf-services.html. Sono stato in grado di aggiungere un riferimento al servizio come descritto nell'articolo. Ho aggiunto un pulsante di forma, e ha aggiunto il seguente codice nel Button1_Click evento:Impossibile trovare l'elemento endpoint predefinito che fa riferimento al contratto

protected void Button1_Click(object sender, EventArgs e) 
{ 
    ServiceReference1.CompanyWcfServiceClient x = new ServiceReference1.CompanyWcfServiceClient(); 
    var result = x.Get_Document_Dates_Received("223278"); 
} 

quando clicco sul pulsante ottengo l'errore:

"Could not find default endpoint element that references contract 'ServiceReference1.ICompanyWcfService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element."

Così ho provato ad aggiungere quanto segue a web.config:. (copiato direttamente dal file web.config del CompanyWcfService

<system.serviceModel> 
<services> 
    <service name="CompanyWcfServices.CompanyWcfService" behaviorConfiguration="ServiceBehavior"> 
    <endpoint address="" binding="webHttpBinding" contract="CompanyWcfServices.ICompanyWcfService" behaviorConfiguration="webHttpEndpointBehavior" > 
     <identity> 
     <dns value="localhost"/> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">                 
    </endpoint> 
    </service> 
</services> 
<bindings> 
    <webHttpBinding> 
    <binding> 
     <security mode="None"> 
     </security> 
    </binding> 
    </webHttpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name ="webHttpEndpointBehavior"> 
     <webHttp helpEnabled ="true" faultExceptionEnabled="true" automaticFormatSelectionEnabled="true"/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 

ottengo lo stesso errore esatto, ci deve essere qualcosa d'altro goin g on.

fine ho rinunciato e chiamato il servizio come questo:

HttpWebRequest request = WebRequest.Create(@"http://merlin/Companyservices/CompanyWcfService.svc/Get_Document_Dates_Received/223278") as HttpWebRequest; 
request.Credentials = CredentialCache.DefaultCredentials; 
HttpWebResponse response = null; 

var result = ""; 
try 
{ 
    response = request.GetResponse() as HttpWebResponse; 
    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     using (Stream stream = response.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(stream, Encoding.UTF8); 
      result = reader.ReadToEnd(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    result = ""; 
} 

Ho passato ore a leggere i messaggi e la maggior parte di loro suggerisce per copiare le informazioni di configurazione nel file web.config. Questo mi sembra problematico (oltre al fatto che non sembra funzionare). Cosa succede se ho bisogno di consumare un servizio WCF di terzi? Devo richiedere le informazioni di configurazione dalla terza parte? E Visa Versa, se creo un servizio WCF progettato per essere consumato da terze parti, devo fornire anche il file di configurazione?

risposta

15

L'errore indica che non è stato definito un endpoint nella sezione di configurazione del client. Quando aggiungi il riferimento al servizio nel tuo progetto, dovrebbe creare la sezione client per te. Se poi non nel web.config per la vostra applicazione all'interno della sezione system.serviceModel aggiungere il seguente

<client> 
    <endpoint 
     name="CompanyWcfService_webhttpBinding" 
     address="http://merlin.com/CompanyServices/CompanyWcfService.svc" 
     binding="webHttpBinding" 
     contract="CompanyWcfServices.ICompanyWcfService" 
     behaviorConfiguration="webHttpEndpointBehavior" 
    /> 
</client> 
+0

Inoltre. Nella sezione system.ServiceModel della tua app web.config non dovresti aver bisogno della sezione servizi. Lo cancellerei. Hai solo bisogno di elementi definiti di riferimento nella sezione client. Come le impostazioni di configurazione o associazione del comportamento, se personalizzato. –

+0

Matt, grazie per la risposta. Scusa però, ho ancora lo stesso errore. – user1337493

+0

Questo problema sembra essere una mancata corrispondenza tra il servizio e il web.config nell'applicazione. L'errore indica che non è possibile trovare un servizio con il contratto "ServiceReference1.ICompanyWcfService". Nota nel tuo web.config nell'app web il contratto è "CompanyWcfServices.ICompanyWcfService". Hai per caso creato un servizio, aggiungi un riferimento nella tua app Web e poi cambia lo spazio dei nomi del servizio? –

9

Se abbiamo architettura a strati in modo di 1) aggiungere app.config in "tutti i progetti" 2) Aggiungi i dettagli di configurazione del servizio in app.config 3) esegui il progetto

+0

Grazie per avermelo ricordato! :) – user1477388

1

In realtà il trucco per questo è stato quello di utilizzare il svcutil.exe per creare il proxy. Stavo cercando di creare il proxy tramite la procedura guidata "Aggiungi servizio" di Visual Studio. Una volta che l'ho fatto, la configurazione è stata un gioco da ragazzi.

SvcUtil.exe

7

Se il progetto fa riferimento una libreria e cercando di utilizzare le funzioni di WCF dalle funzioni di quella libreria, allora si può provare a copiare l'endpoint client dal file di configurazione di progetto al file di configurazione della DLL. Qualcosa di simile mi è successo qualche tempo fa, poiché la libreria a cui facevo riferimento nel progetto non utilizzava il file di configurazione del progetto (in cui l'endpoint del client era configurato poiché il servizio veniva referenziato lì) ma il suo era il risultato era il sistema non è riuscito a trovare le configurazioni del punto finale.

+0

Lo stesso: nel mio caso si trattava di un progetto di test che faceva riferimento a una funzione condivisa nel mio progetto principale. L'app.config a cui si fa riferimento era quella del progetto di test, non il progetto principale. Grazie! – Jeff

2

L'aggiunta di valori client e di binding da app.config a default web.config ha risolto il problema.

4

Nel mio caso ho avuto un progetto WPF che fa riferimento a un UserControl esterno che aveva un riferimento di servizio. Ho dovuto aggiungere anche il riferimento del servizio al progetto principale.

+0

Grazie! Questo era lo stesso problema che avevo – Chance

Problemi correlati