2011-10-07 14 views
21

Sto scrivendo un client su un servizio WCF. Questa è una singola app in un sistema più grande che include moduli scritti in C#, C++, VB e Java. Tutte le app condividono meccanismi di configurazione e di registrazione comuni, indipendentemente dalla lingua in cui sono stati scritti..NET: distribuzione di un client WCF, senza un'app.config

Mi piacerebbe capire come creare l'applicazione client in modo che venga eseguita senza app.config. Perché? Poiché la maggior parte di ciò che è in app.config è boilerplate, non è consentito che gli amministratori di sistema siano autorizzati a cambiare, e quali impostazioni dovrebbero essere autorizzate dagli amministratori di sistema nella configurazione a livello di sistema e non in un file app.config seduto nella directory bin.

Caso in questione - app.config del cliente attualmente appare così:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="WSHttpBinding_ICourierService"> 
      <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation" 
      ... 
      </security> 
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
      messageVersion="Default" writeEncoding="utf-8"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <httpTransport manualAddressing="false" 
      ... 
      useDefaultWebProxy="true" /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:57102/MyService.svc" 
     ... 
     > 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

Si tratta di un gruppo di boilerplate opaco che gli amministratori di sistema non dovrebbero avere a che fare con. La maggior parte è stata inserita da Visual Studio. Ho apportato una modifica al file: ho aumentato la dimensione massima in <readerQuotas/>. Ma questo è un cambiamento che non voglio fare con gli amministratori di sistema. E non c'è nient'altro nel file che voglio che gli amministratori di sistema facciano casino con eccezione di <endpoint address=""/>.

E sto tirando l'indirizzo dell'endpoint dalla configurazione a livello di sistema, e l'impostazione nel codice. Non c'è nulla in questo file che dovrebbe essere modificabile dall'utente.

Quindi, come si configura cose in modo che non ho bisogno di averlo presente?

Posso incorporarlo come una risorsa in assemblea, e agganciare nel processo di caricamento app.config, il mio modo di fare con le DLL richieste?

è l'unica scelta per creare il codice per configurare le cose, il modo in cui sto usando il codice per impostare l'indirizzo dell'endpoint? Creare i collegamenti necessari, ecc., Nel codice? In che modo, quindi, so quale codice scrivere, dati questi blocchi di XML opaco?

+0

C'era me amministratori di sistema di pensiero dovrebbe essere in grado di cambiare le cose come setttings servizio WCF, sciocco me. – ChrisBint

+1

Che tipo di impostazione? URL? Certamente. Attacchi? Perché? Sto costruendo un client per parlare con un servizio in esecuzione su IIS. Non è necessario consentire agli amministratori di sistema di modificare l'associazione con qualcosa di diverso da HTTP. –

+0

E i nomi degli host e qualsiasi cosa abbia a che fare con il parlare effettivamente con il servizio. – ChrisBint

risposta

36

È possibile utilizzare il codice seguente per creare i binding, che è ciò che sta facendo la configurazione. Non sono sicuro che ciò ti consenta di rimuovere del tutto il file, ma l'applicazione non userà la configurazione se questo è il caso. Mettere i propri valori nelle timeout, ecc

var binding = new WSHttpBinding(); 
    binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.MaxReceivedMessageSize = 10000; 
    binding.ReaderQuotas.MaxStringContentLength = 10000; 
    binding.ReaderQuotas.MaxDepth = 10000; 
    binding.ReaderQuotas.MaxArrayLength = 10000; 
    var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc"); 
    var myClient = new WebServiceclient(binding, endpoint); 
+1

Ci sto provando, ma sto ricevendo un errore: "Impossibile elaborare il messaggio perché il tipo di contenuto 'text/xml; charset = utf-8' non era il tipo previsto 'application/soap + xml; charset = utf -8 '" –

+4

Provare a modificare la linea di creazione del binding su: var binding = new BasicHttpBinding(); – Graymatter

+0

dove metteresti esattamente questo codice, global.asax? test unitario? – PositiveGuy

-1

impostazioni WCF possono essere impostate nel codice, senza la necessità di un file di configurazione esterno. Indirizzi, collegamenti, endpoint, sicurezza, ecc. Possono essere tutti configurati in codice. Questo è il modo migliore per essere coerenti tra tutti i servizi WCF e non consentire agli utenti di manomettere queste impostazioni.

suggerisco si espone l'indirizzo (nome host e il numero di porta) per gli utenti e consentire loro di configurare questo in qualche modo, perché gli indirizzi sono specifici per cui sono ospitati i propri servizi WCF.

+3

Che possano essere impostati nel mio codice non significa che sia facile capire come impostarli nel mio codice. –

+0

Hai alcune opzioni per capire come impostare le impostazioni WCF nel tuo codice: (1) Sfoglia le pagine MSDN correlate. (2) Ottenere un buon libro su WCF, come _Programming WCF Services_. (3) Vedi [questo] (http://stackoverflow.com/questions/54579/wcf-configuration-without-a-config-file) per qualche consiglio. – Bernard

+0

dove in codice, quale file, global.asax? – PositiveGuy