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:

AnhadirWS_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.

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor

Escrito por un humano, no por una IA