2009-05-07 14 views
10

Tengo un servicio WCF que funciona bien si creo el servicio sin especificar ningún enlace o punto final (lo lee de los valores generados en el App.config cuando registré el WCF a través de Visual Studio).WCF: ¿Cómo puedo recrear de forma programática estos valores de App.config?

Tengo un método simple que devuelve la referencia de servicio:

return new SmsServiceReference.SmsEngineServiceClient(); 

Esto funciona bien (porque los valores se leen de la configuración). Sin embargo, me gustaría tener algunos de estos valores en una base de datos (el URI por ejemplo) y me gustaría hacer algo como esto:

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

Esto no funciona. Lanza una excepción cuando trato de usar la referencia de servicio.

Sospecho que esto se debe a que mi App.config tiene más información que las dos líneas no están proporcionando (obviamente). La pregunta es, ¿cómo puedo replicar los siguientes valores de App.Config programáticamente?

Aquí está el fragmento de mi App.Config: (el URI ha sido alterado para proteger al inocente).

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

Respuesta

16

La mayoría de los valores de la config App también son propiedades en la unión y se puede recrear programación. En lo personal, yo uso un método como el que a continuación para crear la unión

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

Y utilizo algo como esto para crear mi dirección de punto final

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

El serviceURI será la dirección URL del servicio tales como http://www.myuri.com/Services/Services.svc/basic

último para crear el cliente de servicios

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

Esto hizo el truco. Gracias. –

1

Pues bien, el extremo de cliente en la configuración especifica esta URL:

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

pero en el ejemplo de código, se crea:

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

Las direcciones deben coincidir - Si el de la configuración funciona, deberás cambiar tu código a:

EndpointAddress endpointAddress = new EndpointAddress("http://www.myuri.com/Services/Services.svc/basic"); 

mente que - hay varios pequeños errores tipográficos en el ejemplo de código (my.uri.com vs www.myuri.com, /service.svc en lugar de /Services/Services.svc).

¿Funciona con la dirección de punto final corregida?

Marc

+0

me disculpo fo r los "pequeños errores tipográficos", solo estaba tratando de ser "simple". El uso de la dirección del punto final en el código (y en la configuración de la aplicación) es el mismo, pero no funciona. Hay una diferencia, la App.config tiene lo básico. Eso no es parte del URI, no sé por qué VSTUDIO agregó eso. Si navega a esa url (con/basic) no funciona. No hace falta decir que probé ambas cosas.Supongo que me falta algo en mi creación de "punto final" que tiene App.config. De hecho, no le estoy dando a mi end point ningún parámetro, excepto el uri, ¿qué pasa con toda la otra información de APp.config? –

+0

La ortografía exacta de la URL es crucial, por lo que ser "simple" aquí genera confusión. ¿Puede mostrarnos el archivo de configuración para la parte del servidor? –

+0

Hola Marc, el problema no era el URI, sino algunos parámetros que tenía en mi web.config de cliente que no estaba pasando al enlace al crearlo programáticamente. Pasé todo exactamente como estaba en web.config (usando la sugerencia de Emmanuel) y funcionó. ¡Gracias por tu ayuda! +1 para usted –

Cuestiones relacionadas