2009-05-07 8 views
10

Ho un servizio WCF che funziona correttamente se creo il servizio senza specificare alcun binding o endpoint (lo legge dai valori generati in App.config quando ho registrato WCF tramite Visual Studio).WCF: come posso ricreare in modo programmatico questi valori App.config?

Ho un metodo semplice che restituisce il riferimento al servizio:

return new SmsServiceReference.SmsEngineServiceClient(); 

Questo funziona bene (perché i valori vengono letti dal config). Tuttavia, mi piacerebbe avere un po 'di questi valori in un database (l'URI per esempio) e vorrei fare qualcosa di simile:

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

Questo non funziona. Genera un'eccezione quando provo a utilizzare il riferimento del servizio.

Ho il sospetto che questo sia dovuto al fatto che il mio App.config ha più informazioni che le due linee in alto non forniscono (ovviamente). La domanda è: come posso replicare i seguenti valori di App.Config in modo programmatico?

Ecco il frammento del mio App.Config: (l'URI è stato modificato per proteggere l'inocent).

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

risposta

16

La maggior parte dei valori nella configurazione App sono anche proprietà nella impegnativi e possono essere ricreati programatically. Personalmente, io uso un metodo come quello qui sotto per creare il legame

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

E io uso qualcosa di simile per creare il mio indirizzo Endpoint

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

Il serviceUri sarà l'URL del servizio, come http://www.myuri.com/Services/Services.svc/basic

al fine di creare il client del servizio

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

Questo ha fatto il trucco. Grazie. –

1

Ebbene, l'endpoint cliente nella configurazione specifica questo URL:

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

ma nel tuo esempio di codice, si crea:

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

Gli indirizzi devono corrispondere - Se quello nella configurazione funziona, dovrai cambiare il tuo codice in:

EndpointAddress endpointAddress = new EndpointAddress("http://www.myuri.com/Services/Services.svc/basic"); 

Attenzione: ci sono vari piccoli refusi nel codice di esempio (my.uri.com vs. www.myuri.com, /service.svc anziché /Services/Services.svc).

Funziona con l'indirizzo dell'endpoint corretto?

Marc

+0

mi scuso fo r i "piccoli refusi", stavo solo cercando di essere "semplice". L'indirizzo dell'endpoint utilizzato nel codice (e nella configurazione dell'app) è lo stesso, ma non funziona. C'è una differenza, App.config ha la cosa/basic. Questo non fa parte dell'URI, non so perché VSTUDIO l'abbia aggiunto. Se navighi su quell'URL (con/basic) non funziona. Inutile dire che ho provato entrambi.Presumo che mi manca qualcosa nella mia creazione "endpoint" che ha App.config. In effetti, non sto dando alcun parametro al mio end point ma l'uri, che dire di tutte le altre informazioni su APp.config? –

+0

L'ortografia esatta dell'URL è cruciale, quindi essere "semplici" qui sta portando alla confusione. Puoi mostrarci il file di configurazione per la parte server? –

+0

Hi marc, il problema non era l'URI, ma alcuni parametri che avevo nel mio client web.config che non stavo passando al binding quando lo creavo programmaticamente. Ho passato tutto esattamente com'era nel web.config (usando il suggerimento di Emmanuel) e ha funzionato. Grazie per l'aiuto! +1 per te –

Problemi correlati