lunes, febrero 11, 2008

Evitando el namespace "http://tempuri.org" con WCF

Hace unos días me toco quitar el ya conocido http://tempuri.org del WSDL y asignarle un namespace específico, es más, esto es lo recomendado por seguridad y como buena practica, en fin, para conseguirlo bastará con lo siguiente:

  • Especificar el Namespace en el ServiceContract (Interfaces):
[ServiceContract(Namespace = "http://MyProject.Tests")]


  • Especificar el Namespace en cada uno de los tipos/clases de datos o contratos; DataContract





[DataContract(Namespace="http://MyProject.Tests")]



  • Quitar el http://tempuri.org de la definición del WSDL y para ello:



    • Añadir el siguiente atributo  al servicio:




    [ServiceBehavior(Namespace="http://MyProject.Tests")]


  • Modificar/Añadir valor a la propiedad "bindingNamespace" del endpoint del servicio según indico concretamente en la línea 2, si no se tiene en cuenta este punto, el namespace por defecto es es "tempuri.org" y aunque cambiemos el namespace en los tres puntos anteriores, este no cambiará:



1 <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
2 <endpoint bindingNamespace="http://MyProject.Tests" address="" binding="wsHttpBinding" contract="WcfService1.IService1">


ó, graficamente:




El valor para esta propiedad, aunque puede ser cualquiera, ¡con un poco de sentido común, claro!, sería conveniente que tomara el mismo que el indicado para el "[ServiceBehavior]".



Este último punto fue el que más tardé en encontrar, ¡y mira que está visible! :-D  ¡si leyera un poco de vez en cuando!, jeje... ¡si es que lo dice claramente al pie de la ventana! De todos modos, es curioso, porque todos los post y artículos que hacen referencia a los namespaces, pasan por alto este último punto.


 


Una ayudita más, un gran logro, :-D.


Saludos
Juanlu