2011-10-07 22 views
21

Escribo un cliente en un servicio WCF. Esta es una aplicación única en un sistema más grande que incluye módulos escritos en C#, C++, VB y Java. Todas las aplicaciones comparten mecanismos comunes de configuración y registro, independientemente del idioma en el que fueron escritos..NET: implementación de un cliente WCF, sin app.config

Me gustaría descubrir cómo crear la aplicación cliente para que se ejecute sin un app.config. ¿Por qué? Debido a que la mayor parte de lo que se encuentra en la aplicación.config es una repetición que los administradores del sistema no deberían poder cambiar, y la configuración que los administradores de sistemas deberían poder cambiar debería estar en la configuración de todo el sistema, y ​​no en un archivo app.config sentado en el directorio bin.

El caso en cuestión - app.config del cliente Actualmente tiene este aspecto:

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

Es un montón de texto modelo opaco que los administradores de sistemas no deberían tener que tratar. La mayor parte fue insertada por Visual Studio. Hice un cambio en el archivo: aumenté el tamaño máximo en <readerQuotas/>. Pero ese es un cambio con el que no quiero que jueguen los administradores de sistemas. Y no hay nada más en el archivo con el que quiero que los administradores de sistemas entren en problemas excepto por el <endpoint address=""/>.

Y estoy sacando la dirección del punto final de la configuración de todo el sistema y configurándola en código. No hay nada en este archivo que deba ser editable por el usuario.

Entonces, ¿cómo configuro las cosas para no tener que tenerlas?

¿Puedo incrustarlo como un recurso en el ensamblado y engancharme en el proceso de carga de app.config, del mismo modo que hago con los archivos DLL necesarios?

¿Es la única opción para crear código para configurar cosas, la forma en que estoy usando el código para establecer la dirección del punto final? Crear los enlaces necesarios, etc., en el código? ¿Cómo, entonces, sé qué código escribir, dados estos fragmentos de XML opaco?

+0

Estaba yo pensando que SysAdmins debería ser capaz de cambiar cosas como los ajustes del servicio WCF, tonto conmigo. – ChrisBint

+1

¿Qué tipo de configuración? URL? Ciertamente. Vinculaciones? ¿Por qué? Estoy creando un cliente para hablar con un servicio que se ejecuta en IIS. No es necesario permitir que los administradores del sistema cambien el enlace a otro que no sea HTTP. –

+0

¿Qué hay de los nombres de host y todo lo relacionado con hablar con el servicio. – ChrisBint

Respuesta

36

Puede usar el siguiente código para crear los enlaces, que es lo que está haciendo la configuración. No estoy seguro de si eso le permitirá eliminar el archivo por completo, pero la aplicación no usará la configuración si este es el caso. Ponga sus propios valores en los tiempos de espera, etc.

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

Lo intento, pero aparece un error: "No se puede procesar el mensaje porque el tipo de contenido 'text/xml; charset = utf-8' no era el tipo esperado 'application/soap + xml; charset = utf -8 '" –

+4

Intente cambiar la línea de creación de enlace a: var binding = new BasicHttpBinding(); – Graymatter

+0

donde pondrías este código exactamente, global.asax? ¿prueba de unidad? – PositiveGuy

-1

La configuración de WCF se puede configurar en su código, sin necesidad de un archivo de configuración externo. Direcciones, enlaces, puntos finales, seguridad, etc. pueden configurarse en código. Esta es la mejor manera de ser coherente en todos sus servicios de WCF y no permitir que los usuarios alteren esta configuración.

Sugiero que exponga la dirección (nombre de host y número de puerto) a los usuarios y les permita configurar esto de alguna manera porque las direcciones son específicas de dónde se alojan sus servicios WCF.

+3

Que se puedan configurar en mi código no significa que sea fácil descubrir cómo configurarlos en mi código. –

+0

Tiene algunas opciones para descubrir cómo configurar las configuraciones de WCF en su código: (1) Examine las páginas relacionadas de MSDN. (2) Obtenga un buen libro sobre WCF, como _Programar WCF Services_. (3) Consulte la pregunta [this] (http://stackoverflow.com/questions/54579/wcf-configuration-without-a-config-file) para obtener alguna orientación. – Bernard

+0

donde en el código, ¿qué archivo, global.asax? – PositiveGuy

Cuestiones relacionadas