Petición Proxy


En ocasiones nos puede ser útil; obtener un recurso de otra web final y ofrecer lo desde nuestra web de manera transparente.

Usos

Los usos pueden ser muy variados, sírvase de ejemplo:

  • Ofrecer de una web no publica (intranet) un recurso interno como de una si fuera externo.
  • Crear una web de repositorio compartido para que múltiples webs lo usen transparentemente. De esta manera no nos tenemos que preocupar de actualizar todas las webs para modificar un recurso; sino únicamente la compartida.
  • Ocultar la ruta real de un recurso obtenido desde otra web.
  • En función del usuario establecer permisos complejos para acceder a múltiples recursos

Como

Para ello crearemos un HttpHandler donde implementaremos el proxy hacia el recurso requerido. El HttpHandler obtendrá el recurso solicitado y lo retornará como propio.

  • En el web.config añadiremos la clave EndHost con la parte host de la url de la web final.
  •   <appSettings>
        <add key="EndHost" value="http://MyPrivateWeb/"/>
      </appSettings>
    
  • En el web.config añadiremos el handler.
  •   <system.webServer>
    	<handlers>
          <add name="ProxyHandler.axd_" verb="*" path="ProxyHandler.axd" type="Infrastructure.CrossCutting.Handler.ProxyHandler, Infrastructure.CrossCutting" />	  
        </handlers>
      </system.webServer>  
    
  • Código del Handler.
  • using System;
    using System.IO;
    using System.Net;
    using System.Web;
    using System.Configuration;
    
    namespace Infrastructure.CrossCutting.Handler
    {
        internal class ProxyHandler : IHttpHandler
        {
            public bool IsReusable
            {
                get { return false; }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                String path = String.Empty;
                String cdnHost = String.Empty;
                try
                {
    
                    path = HttpContext.Current.Request.QueryString["file"];
    				// Get end site url from EndHost Key of Web.Config
    				var host = ConfigurationManager.AppSettings["EndHost"];
    				// Mount End url
                    var url = host + path;
    
    				// Makes request to end url
                    var request = WebRequest.Create(url) as HttpWebRequest;
                    using (var response = request.GetResponse() as HttpWebResponse)
                    {
    				    //Read response and Write response to the handler response
                        var responseReader = new StreamReader(response.GetResponseStream());
                        var responseValue = responseReader.ReadToEnd();
                        context.Response.ContentType = response.ContentType;
                        context.Response.Write(responseValue);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Error accessing proxy resource", e);
                }
    
            }
    
        }
    }
    

Finalmente

Por ejemplo, realizando la petición
http://www.MyPublicWeb.com/ProxyHandler.axd?file=Images/privateImage.jpg
se nos retornará la imagen privada de http://MyPrivateWeb/Images/privateImage.jpg desde la web publica.

Anuncios
Esta entrada fue publicada en Desarrollo, Visual Studio, web y etiquetada . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s