2009-01-30 4 views
8

Ich muss mich mit einem WCF-Dienst verbinden, den ich geschrieben habe, ohne eine app.config für die Client-Anwendung bereitstellen zu müssen, die ich schreibe. Allerdings habe ich eine sehr schwierige Zeit damit verbracht, herauszufinden, wie man Dinge vom Client aus im Code einrichtet. Soweit ich weiß ... hat irgendjemand irgendwelche Ideen, was ich tun muss, damit das funktioniert? Ich würde es wirklich schätzen.Wie richtet man einen WCF-Client mit wsDualHttpBinding im Code ein?

Dies ist der Code, den ich bisher habe:

String baseAddress = "http://localhost/CommService"; 

    WSDualHttpBinding binding = new WSDualHttpBinding(); 
    binding.Name = "WSDualHttpBinding_ICommService"; 
    binding.ClientBaseAddress = new Uri(baseAddress); 
    binding.ReliableSession.Ordered = true; 
    binding.ReliableSession.InactivityTimeout = new TimeSpan(0, 10, 0); 
    binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
    binding.SendTimeout = new TimeSpan(0, 0, 5); 

    InstanceContext context = new InstanceContext(this); 
    client = new CommServiceClient(context, "WSDualHttpBinding_ICommService"); 
    client.Endpoint.Binding = binding; 

Und das ist mein Client App app.config:

<system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
      <binding name="WSDualHttpBinding_ICommService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:05" 
       bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
       <security mode="Message"> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
         algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/CommService/" 
      binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_ICommService" 
      contract="Services.ICommService" name="WSDualHttpBinding_ICommService"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Antwort

9

Sie können ganz einfach erreichen, was Sie wollen. Siehe Code unten:

Uri baseAddress = new Uri("http://localhost/CommService"); 
WSDualHttpBinding wsd = new WSDualHttpBinding(); 
EndpointAddress ea = new EndpointAddress(baseAddress, EndpointIdentity.CreateDnsIdentity("localhost")); 
client = new CommServiceClient(new InstanceContext(this), wsd, ea); 

Lassen Sie mich ein wenig erklären:

  • zuerst erstellen wir eine Instanz eines WSDualHttpBinding mit den Standardeinstellungen (das sind die genauen diejenigen, die erzeugte app.config hat). Wenn Sie eine der Einstellungen ändern möchten, können Sie sie über die verfügbaren Eigenschaften ändern.
  • dann erstellen wir eine EndPointAddress mit der gewünschten URL und Identität. Sie müssen sie nicht mit einer Bindung verknüpfen, da wir alle im Service-Client-Konstruktor verknüpfen werden.
  • Zuletzt erstellen wir den Service Client. Eine der Contructor-Überladungen erlaubt uns, eine Binding- und eine Endpoint-Adresse anzugeben.
  • Im Allgemeinen hat jedes in der Datei app.config verfügbare Element eine Klasse in .NET-Code und jedes Attribut oder untergeordnete Element hat eine zugeordnete Eigenschaft in der angegebenen Klasse.
+1

Das hat perfekt funktioniert, danke! Es hat mich verrückt gemacht, haha. –