2009-01-30 8 views
8

Ho bisogno di connettersi a un servizio WCF che ho scritto senza dover distribuire app.config per l'applicazione client che sto scrivendo. Tuttavia, ho avuto un momento molto difficile cercando di capire come impostare le cose dal lato client nel codice. Questo è quanto ho ottenuto ... qualcuno ha qualche idea su cosa devo fare per farlo funzionare? Lo apprezzerei davvero.Come impostare un client WCF usando wsDualHttpBinding nel codice?

Questo è il codice che ho finora:

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; 

e questo è il mio cliente app.config dell'applicazione:

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

risposta

9

Si può facilmente ottenere quello che vuoi. Vedere codice qui sotto:

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

Mi spiego un po ':

  • Per prima cosa creare un'istanza di un WSDualHttpBinding con le impostazioni predefinite (questi sono quelli esatti app.config generato ha). Se si desidera modificare una qualsiasi delle impostazioni, è possibile modificarle tramite le proprietà esposte.
  • quindi creiamo un EndPointAddress con l'URL e l'identità desiderati. Non è necessario collegarlo a un'associazione poiché le collegheremo tutte nel costruttore del servizio Client.
  • infine creiamo il client di servizio. Uno degli overload di contructor ci consente di specificare un binding e un indirizzo endpoint.
  • in generale ogni elemento disponibile nel file app.config ha una classe associata nel codice .NET e ogni attributo o elemento figlio ha una proprietà associata nella classe specificata.
+1

Questo ha funzionato perfettamente, grazie! Mi stava facendo impazzire, ahah. –

Problemi correlati