2009-05-07 14 views
10

Ich habe einen WCF-Dienst, der in Ordnung funktioniert, wenn ich den Dienst ohne Angabe einer Bindung oder Endpunkt (es liest es aus den generierten Werten in der App.config, wenn ich die WCF über Visual Studio registriert) erstellt.WCF: Wie kann ich diese App.config-Werte programmatisch neu erstellen?

Ich habe eine einfache Methode, die den Dienstverweis zurückgibt:

return new SmsServiceReference.SmsEngineServiceClient(); 

Dies funktioniert ok (da die Werte aus der Konfigurations gelesen werden). Ich möchte jedoch in einer Datenbank einige dieser Werte haben (die URI zum Beispiel) und möchte so etwas tun:

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

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

Dies funktioniert nicht. Es wird eine Ausnahme ausgelöst, wenn ich versuche, die Service-Referenz zu verwenden.

Ich vermute, dass dies daran liegt, dass meine App.config mehr Informationen hat, die die beiden Zeilen dort nicht bereitstellen (offensichtlich). Die Frage ist, wie kann ich die folgenden App.Config-Werte programmatisch replizieren?

Hier ist das Fragment meiner App.Config: (Die URI wurde geändert, um die inocent zu schützen).

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

Antwort

16

Die meisten Werte in der App Config sind auch Eigenschaften in der Bindung und kann programmatisch neu erstellt werden. Ich persönlich verwenden, um ein Verfahren wie das unter der Bindung

 

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

zu schaffen und ich so etwas wie dies für die Erstellung meiner Endpoint-Adresse

 

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

Die ServiceUri wird die Dienst-URL sein, wie http://www.myuri.com/Services/Services.svc/basic

schließlich das Service-Client erstellen

 

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

Dies hat den Trick gemacht. Vielen Dank. –

1

Nun, der Client-Endpunkt in der Config spezifiziert diese URL:

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

aber in Ihrem Codebeispiel Sie erstellen:

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

Die Adressen müssen übereinstimmen - Wenn der eine in der Konfiguration funktioniert, müssen Sie Ihren Code ändern:

Beachten Sie - es gibt verschiedene kleine Tippfehler in Ihrem Codebeispiel (my.uri.com vs. www.myuri.com, /service.svc statt /Services/Services.svc).

Funktioniert es mit der korrigierten Endpunktadresse?

Marc

+0

ich entschuldige mich fo Bei den "kleinen Tippfehlern" wollte ich einfach "einfach" sein. Die Verwendung der Endpunktadresse in Code (und in der App-Konfiguration) ist identisch, funktioniert jedoch nicht. Es gibt einen Unterschied, die App.config hat die/Basic-Sache. Das ist nicht Teil der URI, weiß nicht, warum VSTUDIO das hinzugefügt hat. Wenn Sie zu dieser URL (mit/basic) navigieren, funktioniert das nicht. Unnötig zu sagen, dass ich beides versucht habe.Ich nehme an, dass mir etwas in meiner "Endpunkt" -Erstellung fehlt, die die App.config hat. In der Tat gebe ich meinem Endpunkt keinen Parameter außer der URI, was ist mit all den anderen APp.config Informationen? –

+0

Die genaue Schreibweise der URL ist entscheidend, so dass "einfach" hier zu Verwirrung führt. Können Sie uns die Konfigurationsdatei für den Serverteil zeigen? –

+0

Hallo Marc, das Problem war nicht die URI, aber einige Parameter hatte ich in meinem Client web.config, dass ich nicht an die Bindung übergeben wurde, wenn ich es programmatisch erstelle. Ich habe alles genau so übergeben, wie es in der web.config (mit Emmanuels Vorschlag) war und es hat funktioniert. Danke für Ihre Hilfe! +1 für Sie –

Verwandte Themen