Si disponemos de un servicio Web en nuestro servidor que está destinado a ser utilizado por nuestras aplicaciones pero no queremos facilitar que otros programadores le puedan sacar partido: ¿para qué queremos dejar publicado su archivo de descripción WSDL?
El WSDL (Web Services Description Language) describe cómo es un servicio Web: qué tipos usa, qué métodos expone, etc… y es lo que usan Visual Studio y otras herramientas para crear un proxy que nos permita usar un determinado servicio. Se puede visualizar para cualquier servicio de .NET añadiendo ?wsdl al final de su URL, por ejemplo:
http://www.miservidor.com/Servicios/miServicio.asmx?wsdl
Cuando añadimos una nueva referencia Web a nuestro proyecto, en el diálogo que aparece podemos inspeccionar el servicio gracias a su descripción WSDL:
Sin ese WSDL no podríamos inspeccionarlo ni tampoco añadir la clase proxy correspondiente.
Un proxy es una serie de clases .NET que actúan de intermediarias entre nuestro código y el servicio. Para nosotros es transparente el uso del proxy ya que nuestro código las ve como clases normales, y nos parece que estamos manejando de manera directa el servicio y llamando a sus métodos directamente. Sin embargo lo que ocurre es que las clases proxy, por debajo se encargan de hacer las llamadas pertinentes al servicio utilizando la clase SoapHttpClientProtocol por debajo. El nombre de la clase proxy que se crea al agregar una referencia es el que indiquemos en el diálogo anterior( recuadrado en rojo en la figura).
Una vez que está generado el proxy en nuestro proyecto ya no es necesario el WSDL para nada. Es decir, en un servidor en producción, salvo que queramos que cualquiera pueda conectarse y utilizar el servicio, no se necesita exportar el WSDL.
Entonces, lo mejor que podríamos hacer es evitar que se publique esta información en el servidor de producción. No es una medida de seguridad por si sola, ya que no evitará que alguien que conozca el servicio pueda utilizarlo, pero sí que pondrá una buena barrera para la mayor parte de los posibles “curiosos”.
Dado que por defecto, si alguien le añade ?WSDL al nombre del servicio, aparecerá el WSDL del mismo ¿cómo evitamos que esto funcione así?
Puedes evitar que se publique el WSDL añadiendo este ajuste a web.config:
<webServices>
<protocols>
<remove name="Documentation" />
</protocols>
</webServices>
De esta forma podemos decidir por configuración si queremos que sea visible o no, sin tener que tocar el código ni recompilar.
¡Espero que te sea útil!
AÑADIDO 19/08/2010: Quitar WSDL en servicios WCF
A raíz de una pregunta de un lector del blog en Geeks.ms (sitio donde se hace crossposting), si el servicio no es "puro" de ASP.NET sino que se ha construido con Windows Communication Foundation (WCF), entonces para conseguir el mismo efecto basta con retirar el nodo <serviceMetadata> de su configuración para que no se publique el WSDL.