2009-08-14 9 views
8

He escrito un servicio web WCF simple que está configurado programáticamente. Expone tres criterios de valoración que se unen diferentes enlaces con el mismo contrato:Conversión de la configuración programática del servicio WCF al archivo de configuración

  • WebHttpBinding
  • WebHttpRelayBinding (sobre Microsoft Azure)
  • Mybinding (hecho a sí mismo la unión en un DLL adicional)

El el código de configuración es bastante directo en este momento:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 

host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 
TransportClientEndpointBehavior sbBehavior = 
    new TransportClientEndpointBehavior(); 
sbBehavior.CredentialType = TransportClientCredentialType.UserNamePassword; 
sbBehavior.Credentials.UserName.UserName = "azureUserName"; 
sbBehavior.Credentials.UserName.Password = "azurePassword"; 
sbEndpoint.Behaviors.Add(sbBehavior); 

host.AddServiceEndpoint(typeof(MyService), new MyBinding(), "http://someURL"); 

host.Open(); 

Ahora Quiero exportar esta configuración en un archivo de configuración porque quiero poder cambiarlo sin tener que volver a compilar.

Mis preguntas en este momento son:

  • ¿Dónde puedo encontrar información valiosa para lograr mi objetivo? La mayoría de los sitios solo hablan de enlaces SOAP: no se sabe cómo incluir un enlace no estándar.
  • ¿Debo cambiar MyBinding para aceptar la configuración a través de app.config o la llama ServiceModel exactamente como mi enfoque programático cuando la configuración es correcta?

Respuesta

11

OK, así que las cosas más importantes son:

  • dirección
  • vinculante
  • contrato

y luego un poco de materia adicional lanzada en

1). Dirección:

conseguir esto de aquí:

WebServiceHost host = new WebServiceHost(
    typeof(MyService), new Uri("http://localhost:80/")); 
host.AddServiceEndpoint(typeof(MyService), new WebHttpBinding(), ""); 

y aquí:

ServiceEndpoint sbEndpoint = host.AddServiceEndpoint(
    typeof(MyService), new WebHttpRelayBinding(), "http://azureURL"); 

por lo que tendrá algo como:

<endpoint address="" 
<endpoint address="http://azureURL" 
<endpoint address=""http://someURL" 

en su servicio.

2) Encuadernación:

El primer extremo es un webHttpBinding, el segundo utiliza un enlace personalizado ("Mybinding") - por lo que tiene:

<endpoint address="" 
      binding="webHttpBinding" 
<endpoint address="http://azureURL" 
      binding="webRelayHttpBinding" 
<endpoint address=""http://someURL" 
      binding="myBinding" 

y necesitará definir su unión personalizado:

<bindings> 
    <customBinding> 
    <binding name="MyBinding"> 
     .. define the parameters of your binding here 
    </binding> 
    </customBinding> 
</bindings> 

o crear una sección <extensions> para su unión almacena en código en un ensamblado independiente.

3) Los contratos

no veo claramente un contrato en cualquier lugar - para que sólo utiliza el typeof (MyService), pero por lo general, este es el servicio concreto ejemplo, no el servicio contrato cuales debería ser una interfaz (algo así como IMyService). ¿Por qué no tienes un contrato de servicio explícito? (! No las mejores prácticas pero posible)

De todos modos, si su implementación del servicio es el contrato, también, al mismo tiempo, entonces usted tiene sus dos puntos extremos de esta manera:

<endpoint address="" 
      binding="webHttpBinding" 
      contract="MyService" /> 
<endpoint address="http://azureURL" 
      binding="webHttpRelayBinding" 
      contract="MyService" /> 
<endpoint address="http://someURL" 
      binding="myBinding" 
      contract="MyService" /> 

este caso es necesario añadir unos rocía aquí y allá (definen la "dirección base" del servicio, dan el servicio un nombre y así sucesivamente), y deben terminar con algo como:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="MyBinding"> 
      .. define the parameters of your binding here 
     </binding> 
     </customBinding> 
    </bindings> 
    <services> 
     <service name="YourNameSpace.MyService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:80/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="webHttpBinding" 
        contract="MyService" /> 
     <endpoint address="http://azureURL" 
        binding="webHttpRelayBinding" 
        contract="MyService" /> 
     <endpoint address="http://someURL" 
        binding="myBinding" 
        contract="MyService" /> 
     </service> 
    </services> 
</system.serviceModel> 

Ahora todo lo que se está perdiendo es la comportamiento definido - Lo dejo como ejercicio para el póster :-)

¿Eso ayuda a algo?

En cuanto a referencias - hmmm ..... difícil de decir ... Supongo que los libros habituales ("Learning WCF" de MLBustamante para principiante/intermedio, "Programación WCF" de Juval Lowy para intermedio/avanzado) son mi mejor apuesta, y mucha experiencia, realmente. No conozco ninguna fuente que muestre explícitamente y enseñe cómo convertir las configuraciones en código y configuración: los dos libros mencionados suelen mostrar ambas formas y, a partir de esto, usted mismo puede descifrarlo.

Marc

+0

Gracias por explicar el proceso de creación del archivo de configuración. Como esperaba, la implementación del servicio también es el contrato. Lo he elegido porque el contrato consiste solo de dos funciones muy generales y no es reutilizable. Lo intenté primero solo con el enlace webHttpBinding y comenté la configuración programática existente. Sin embargo, no funciona. El servicio no es accesible cuando abro http: // localhost en mi navegador web. ¿Tengo que hacer algunas otras configuraciones para la aplicación en VS? (. Es una "aplicación de consola" estándar por el momento) – Etan

+0

Bueno, un problema que se tiene es: para la unión del webHttp, necesita la WebServiceHost - para los otros enlaces, necesita la ServiceHost recta - por lo que probablemente no será capaz de alojar todos los puntos finales en un solo (servicio de Internet) ServiceHost –

1

El prolem con el archivo de configuración no ser reconocido correctamente podrían resolverse.

sólo tenía que añadir

ServiceHost h = new ServiceHost(typeof(MyService)); 
h.Open(); 

a mi código, he pensado que el ServiceModel iniciará el servicio de forma automática ya que conoce toda la información. Es algo extraño que agregue información sobre "MyService" en el archivo config y luego también tenga que especificarlo en el código.

Sin embargo, la verdadera respuesta a mi problema fue dada por marc_s, que describen todo el proceso de conversión de enfoque programático para el archivo de configuración muy bien.

Cuestiones relacionadas