Blogger news

23:23
2
En algunas ocaciones, tenemos la necesidad de comenzar con alguna migracion de una aplicacion ASP Clasica a ASP.NET. Si la aplicación es grande, seguramente sera necesario realizar la migracion paulatinamente; existe un problema con el manejo de sesiones entre ASP y ASP.NET, ya que se son diferentes. Existen soluciones, como pasar los valores por la URL, en campos ocultos, y otros mas, pero estos no so seguros, debemos de considerar principalmente este este punto.

El estado de la sesión es administrada por ASP a través del uso de una cookie que es enviada desde el servidor hacia el cliente. Si nos fijamos en la respuesta HTTP, verás algo como esto:

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0 Date: Mon,07 Apr 2003 12:52:26GMT
Content-Length: 10225
Content-Type: text/html
Cache-control: private
Set-Cookie: ASPSESSIONIDCSCRRCBS=GODPKFJDPJNMHGGJDOEIDDMK;

Todas las solicitudes enviadas desde el cliente al servidor incluirá la cookie de sesión ASP junto con la solicitud. Este cookie permite que IIS asociar la solicitud con una sesión concreta que se almacena en el servidor.

ASP.NET utiliza la misma técnica para mantener el estado de la sesión, salvo que una cookie se visualiza en el nombre. En el caso de que un par de sesiones de ASP y ASP.NET se han establecido en el mismo servidor, el navegador enviará las cookies de ASP y ASP.NET por cada solicitud. La solicitud se verá como esto:

GET /MixedSessions/ASPSession.aspx HTTP/1.0
...headers removed to simplify example...
Cookie: ASPSESSIONIDAAR=NGHNLJKBBJG;
ASP.NET_SessionId=q5ydd3t45....


La solución es permitir que una aplicación ASP.NET pueda recuperar variables de una Session de ASP. El proceso seria el siguiente:

1. El navegador envía una solicitud al servidor. Esta solicitud contendrá la ASP y ASPX ("cookies").
2. Una ASPX (que necesita información de una Session de ASP), creará una petición HTTP y envían una página ASP que está diseñado específicamente para regresar las variables objeto Session de ASP de manera segura.
3. La página ASP auntentica que la petición es de una página ASP.NET local. Entonces la variable de Session es retornada en la respuesta HTTP.
4. La página ASP.NET hará todo lo que se necesita y generará la respuesta.
5. La respuesta se devuelve al usuario.

La página ASP contendrá el siguiente código (VariablesSession.asp):

<%@ Language=VBScript %>

<%
dim sT
if Request.ServerVariables("REMOTE_ADDR") = Request.ServerVariables("LOCAL_ADDR") then
    sT = Request("VariablesSession")
    if trim(sT) <> "" then
      Response.Write Session(sT)
    end if
end if
%>


La clase .NET que solicita al ASP quedaría de la siguiente manera:

using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace IntercambioSesiones
{
    public class BO_ASPtoNET
    {
        public HttpContext z_varacioContext;
        public string z_varastrSessionVarASP;

        public BO_ASPtoNET(HttpContext z_parcioInContext)
        {
            z_varacioContext = z_parcioInContext;
            z_varastrSessionVarASP = "VariablesSession.asp";
            /* Construimos el objeto System.Uri para obtener la
               URL para enviar la solicitud HTTP . que contiene el
               objeto System.Uri que representa cada URL ASPXs.
            */
            System.Uri z_varocioURL = z_varacioContext.Request.Url;
            z_varastrSessionVarASP = z_varocioURL.Scheme + "://" + z_varocioURL.Host + ":" + z_varocioURL.Port.ToString() + "/" + z_varastrSessionVarASP;
        }

        public string z_metuGetSessionVar(string z_parstrSessionVar)
        {
            // En primer lugar obtienen la cookie de la sesión
            string z_varostrASPCookieName = "";
            string z_varostrASPCookieValue = "";
            if (!z_metuGetSessionCookie (out z_varostrASPCookieName, out z_varostrASPCookieValue))
            {
                return "";
            }

            // Inicializar el WebRequest.
            HttpWebRequest z_varocioMyRequest = (HttpWebRequest)WebRequest.Create(z_varastrSessionVarASP + "?VariablesSession=" + z_parstrSessionVar);
            
            z_varocioMyRequest.Headers.Add("Cookie: " + z_varostrASPCookieName + "=" + z_varostrASPCookieValue);

            // Enviar la solicitud y obtener una respuesta.
            HttpWebResponse z_varocioMyResponse = (HttpWebResponse)z_varocioMyRequest.GetResponse();

            Stream z_varocioReceiveStream = z_varocioMyResponse.GetResponseStream();

            System.Text.Encoding z_varocioEncode = System.Text.Encoding.GetEncoding("utf-8");

            StreamReader z_varocioReadStream = new StreamReader(z_varocioReceiveStream, z_varocioEncode);

            string z_varostrResponse = z_varocioReadStream.ReadToEnd();

            z_varocioMyResponse.Close();
            z_varocioReadStream.Close();
            return z_varostrResponse;
        }


        private bool z_metuGetSessionCookie(out string z_parstrASPCookieName, out string z_parstrASPCookieValue)
        {
            HttpCookie z_varocioMyCookie;    

            z_parstrASPCookieName = "";
            z_parstrASPCookieValue = "";

            // Capturar todos los nombres de cookies de una cadena en la matriz.
            String[] z_varostrCookieArray = z_varacioContext.Request.Cookies.AllKeys;

            // Recorrer el objeto cookie por su nombre:
            for (int i = 0; i < z_varostrCookieArray.Length; i++)
            {
                z_varocioMyCookie = z_varacioContext.Request.Cookies[z_varostrCookieArray[i]];
                if (z_varocioMyCookie.Name.StartsWith("ASPSESSION"))
                {
                    z_parstrASPCookieName = z_varocioMyCookie.Name;
                    z_parstrASPCookieValue = z_varocioMyCookie.Value;
                    return true;
                }
            }
            return false;
        }
    }
}


Ahora instanciado la clase BO_ASPtoNET para utilizar el metodo z_metuGetSessionCookie y asi obtenr la variable de sesion que requerimos.

BO_ASPtoNET z_varocioSesion = new BO_ASPtoNET(Context);
string z_varostrIdUsuario = z_varocioSesion.z_metuGetSessionVar("Id_User");



Listo...... Espero que les sea de utilidad.


Ailas......

2 comentarios:

  1. Ta bueno el truco pero habrías de usar las reglas del StyleCop para los nombres, etc.

    saludos

    ResponderEliminar
  2. naaa retiro lo dicho, vil copy paste

    http://blogs.clearscreen.com/juanjo/archive/2006/02/02/2737.aspx

    ResponderEliminar