Condividere le variabili Application e Session tra Classic ASP e ASP.NET

di Andrea Zani, in ASP.NET,
  • 0
  • 0
  • 0
  • 6,56 KB

La convivenza tra le ASP tradizionali e ASP.NET non crea problemi sui server Microsoft dalla versione 2000. E' sufficiente abilitare il supporto per le ASP e installare il .NET Framework per poter usufruire di entrambe le tecnologie nelle proprie web application.
Entrambe possono accedere a database, utilizzare servizi e quant'altro. I problemi nascono nella necessità di dover usufruire, scambiare, leggere delle variabili Session e Application da entrambe le tecnologie.

Da ASP ad ASP.NET e ritorno

Come i più sanno, infatti, le variabili Session e Application di entrambe le tecnologie, non hanno nulla in comune se non il nome. Se scriviamo in una pagina ASP questo codice:

 <%
Session("variabile")="ciao"
%>

E poi proviamo in una pagina ASP.NET presenta nella stessa cartella, a leggere tale variabile, non otterremo il risultato voluto:

 <script language="vb" runat="server">
Sub Page_Load()
  Label1.Text=Session("variabile").ToString()
End sub
</script>
<asp:label id="Label1" runat="server" />

Anzi, avremo un bell'errore, dato che tale variabile non è mai stata creata all'interno dello scope della web application:

Immagine

Un trucco per raggirare il problema

Dunque, com'è facilmente intuibile, le variabili Session e Application di entrambe le tecnologie utilizzano zone di memoria all'interno del loro ambiente di esecuzione. Le variabili create dalle ASP saranno leggibili solo da questa tecnologia; quelle create dall'ASP.NET all'interno solo di questa ambiente. Come possiamo risolvere la cosa?

Il trucco, banale ma funzionale, c'è: è sufficiente richiedere da una pagina ASP.NET una pagina ASP per leggere il contenuto di una variabile Session e Application di quell'ambiente, e viceversa per poter leggere dalle ASP gli oggetti presente nelle pagine .NET.

Proviamo a leggere una variabile Application presente nell'ambiente ASP tradizionale da una pagina ASP.NET. Iniziamo a scrivere una pagina ASP contenente questo codice dandogli il nome "ReadAsp.asp":

<%
on error resume next
tipo=request("type")
name=request("name")
if tipo="session" then
  if Session(name)="" then
   Response.Write(" ")
  else
   Response.Write (Session(name))
  end if
end if

if tipo="application" then
  if Application(name)="" then
   Response.Write(" ")
  else
   Response.Write(Application(name))
  end if
end if
Response.End()
%>

Questo codice, che è anche quello presente nell'esempio allegato a questo articoli, una volta richiamato controlla che tipo di variabile si vuole leggere e il suo nome, quindi la visualizza con un banale Response.Write. Per esempio, per leggere visualizzare il contenuto della variabile Application "esempio", ci è sufficiente richiamare tale pagina con i parametri voluti:

<a href="http://localhost/ReadAsp.asp?type=Application&name=esempio">
http://localhost/ReadAsp.asp?type=Application&name=esempio</a>

Dalla nostra pagina ASP.NET è sufficiente utilizzare la tecnica denominata "URL grabbing" per richiamare quella pagina ASP e prenderne il contenuto. Se dalla nostra pagina ASP.NET vogliamo leggere il contenuto della variabile Application "esempio" utilizzata in ASP, possiamo scrivere:

...
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://localhost/ReadAsp.Asp?type=Application&name=esempio");
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream());
contenuto_variabile=sr.ReadToEnd();
...

Semplice, no? Per fare la stessa cosa ma da una pagina ASP, dobbiamo scrivere una pagina ASP.NET di nome "ReadNet.aspx" con questo contenuto:

<%@ Page language="c#" %>
<script runat=server>
void Page_Load() {
  string name=Request["name"];
  string tipo=Request["type"];
  if (tipo=="session")
  {
     if (Session[name]==null) Response.Write ("");
     else
     Response.Write (Session[name].ToString());
  }
  if (tipo=="application")
  {
     if (Application[name]==null) Response.Write ("");
     else
     Response.Write (Application[name].ToString());
  }
}
</script>

Quindi, per prendere il contenuto di una variabile Application utilizzata nell'ambiente .NET da una nostra pagina ASP:

 Dim objXMLHTTP, StrURL
StrURL = "http://localhost/ReadNet.aspx?type=application&name=esempio"

Set objXMLHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")

objXMLHTTP.Open "GET", StrURL, false
StrCookie = Request.ServerVariables("HTTP_COOKIE") ' <- queste due righe verranno spiegate di seguito
objXMLHTTP.setRequestHeader "COOKIE", StrCookie  ' < ...

objXMLHTTP.Send
contenuto_application=CStr(objXMLHTTP.ResponseText)
Set xml = Nothing
2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti