Request.Url.AbsoluteUri dejó de funcionar al habilitar SSL

Cuando una aplicación Web que has desarrollado para un cliente está funcionando en producción de forma correcta, cualquier cambio o modificación sobre infraestructura del servidor te hará temblar porque sabes que de alguna forma algo ocurrirá y por algún extraño motivo la aplicación dejará de funcionar correctamente.

unexpected_error

Imagen de dullhunk, extraida de flickr

Esto me ha ocurrido reciente con una aplicación Web desarrollada en ASP.NET con C#,  en la que hago uso del control FileUpload AJAX. Este control permite subir ficheros al servidor de forma asíncrona sin tener que realizar un envío completo de la página. Mi implementación en la aplicación ha sido insertar varios controles en la página para que el usuario pueda ir subiendo uno a uno los archivos sin tener que esperar a que el anterior que ha seleccionado termine.

En el caso del cliente el problema apareció cuando habilitaron SSL en el servidor para aportar mayor seguridad. Desde ese momento el control dejó de funcionar y se producía el error de javascript que vemos en la siguiente imagen, rechazando la subida de archivos porque se está realizando una petición HTTP cuando debería ser una petición HTTPS.

error-javascript

Analizando el código fuente del control, que está disponible a través del link de descarga de la página principal, me doy cuenta de que se utiliza un iframe para realizar la subida de archivos de forma asíncrona. Dentro de este iframe se escribe la dirección a la que subir los archivos directamente haciendo uso de la propiedad Reques.Url.AbsoluteUri que es dónde se produce el error porque está escribiendo una dirección HTTP.

Después de hablar con las personas responsables de la infraestructura y de preguntar a Google por el error llegamos a la conclusión de que es debido al balanceador o proxy que están utilizando, ya que como podemos ver en la siguiente imagen el proxy es el responsable del tráfico SSL entre el usuario y la aplicación pero después a la hora de enviar la petición al servidor correspondiente de la granja se realiza utilizando HTTP, por eso desde la aplicación al utilizar la sentencia Reques.Url.AbsoluteUri se escribe la dirección sin utilizar SSL

esquema-red

 

La solución a este problema ha sido configurar el balanceador para que las peticiones a los servidores de la granja se realicen también utilizando SSL y a partir de ese momento la sentencia Reques.Url.AbsoluteUri  del control escribe correctamente la dirección utilizando SSL.

¿Has tenido algún problema con aplicaciones en producción como consecuencia de alguna modificación ajena a tí? Si te has encontrado en alguna situación parecida o tienes algo que decir sobre esta entrada, puedes dejarme tú opinión en los comentarios.

 

AGREGAR COMENTARIO