Some time ago, I got into
a bit of a research theme about figuring out how to interoperate Session
state between classic ASP and ASP.NET. The reasoning was that a lot of
developers have Classic ASP sites, and want to migrate to ASP.NET a piece
at a time, and Session State transfer between them was the sticky issue.
There has also been considerable newsgroup discussion about this issue,
most everyone saying it "can't be done". You can follow some
of the original threads HERE.
If you read through these (and there are many others - its a very common
question!) you will see that 9 out of 10 respondents, including the MVP's
and MS gurus, are all saying "it can't be done...".
I eventually gave up as I really didn't need to do it at the time, but
recently Robbe Morris, my erstwhile Eggheadcafe.com developer partner,
and I decided we were going to make some additions to the site in ASP.NET.
The problem was, most of our site is still written in Classic ASP. We've
spent a lot of time optimizing it, it scales great, and we have no particular
inclination to "prove to the world" that we can rewrite the
whole site in ASP.NET. Newer stuff of course, we almost always write in
ASP.NET because we love it.
So unfortunately (or fortunately, as the case may be) I had to revisit
this "impossible problem". Fact is, the answer is so simple
if you just sit down and think it through!
The easiest way to explain this is to simply post the code, so here goes.
These pages appear in the same order in which they are used, so just read
through the code below:
<TITLE>ASPPage1.asp</TITLE>
<%
' This is the page where we just set some Classic ASP Session Variables
' ASPPage2.asp is where the work is done.
Session("username")="joeblow"
session("email")="joe@blow.com"
Session("userid")=2
Session("DestPage")="Finalpage.aspx"
Server.Transfer("ASPPage2.asp")
%>
==========================================================================
<TITLE>ASPPage2.asp</TITLE>
<%
' We graf all the session variable names/values and stick them in
a form
' and then we submit the form to our receiving ASP.NET page (ASPNETPage1.aspx)...
Response.Write("<form name=t id=t action=ASPNETPage1.aspx
method=post >")
For each Item in Session.Contents
Response.Write("<input type=hidden name=" & Item)
Response.Write( " value=" & Session.Contents(item)
& " >")
next
Response.Write("</FORM>")
Response.Write("<script>t.submit();</script>")
%>
============================================================================
<TITLE>ASPNETPage1.aspx</TITLE>
<%@ Page language="c#" %>
<script runat=server>
// We iterate through the Form collection and assign the names and
values
// to ASP.NET session variables! We have another Session Variable,
"DestPage"
// that tells us where to go after taking care of our business...
private void Page_Load(object sender, System.EventArgs e)
{
for(int i=0;i<Request.Form.Count;i++)
{
Session[Request.Form.GetKey(i)]=Request.Form[i].ToString();
}
Server.Transfer(Session["DestPage"].ToString(),true);
}
</script>
==============================================================================
<TITLE>FinalPage.aspx</TITLE>
<%@ Page language="c#" %>
<script runat=server>
// This page is just a "proof of concept page"...
private void Page_Load(object sender, System.EventArgs e)
{
Response.Write("Shared Session Variable Names/Values between
Classic ASP and ASP.NET:<BR>");
for (int i = 0; i < Session.Contents.Count; i++)
{
Response.Write("Assigned to \"" +Session.Keys[i].ToString()+"\"");
Response.Write(" Value: "+ Session[i].ToString() +"<BR>");
}
}
</script>
|
As can be easily seen, all we need to do is grab the Classic ASP Session
variables, contruct a dynamic form in a new Classic ASP page consisting
of their names and values as hidden form fields, and submit it to our
receiving ASP.NET page where we simply iterate the Form NameValueCollection
, sticking the names and values into ASP.NET variables! You want to use
Server.Transfer because its much more efficient than making another browser
trip with Response.Redirect.
To make it more extensible, one of the Session variables, "DestPage"
is used to tell us "where to go" when we're done with our little
conversion. You would probably want to set this in the page that makes
the call to the utility page, ASPPage2.asp. In this manner, you can use
the two pages ASPPage2.asp and ASPNETPage1.aspx in almost any situation.
And don't forget - you can reverse the process just as easily to transfer
ASP.NET Session variables back to Classic ASP! As a last note, one reader
commented about how you would handle the fact that somebody was in the
ASP.NET portion of your site and meanwhile their Classic ASP session had
expired. No problem! Since you brought all your session "baggage"
with you when you came over, all of it (including any new stuff) would
simply come back with you into a brand new ASP Session.
What about Objects and Arrays?
Objects are pretty much out of the question because Classic
ASP has the most weakly typed script system around (or should I say, when
everything is a variant, I wouldn't consider it a typing system). However,
if you had an ADO Recordset in Classic ASP Session state, you could flatten
it out into its XML Representation as a string by saving it with the Recordset.Save
method into an ADODB.Stream object, read out the stream as text to, store
that in a Session variable, and then easily decode it into a DataSet on
the back end with SelectNodes("//z:row") if you had to. Arrays,
including multidimensional arrays, as long as they can be flattened out
into a string, can also be transferred. Just as a little "bonus"
the downloadable zip below has code pages to do this process in both directions
- ASP.NET -->ASP and ASP-->ASP.NET! Enjoy.
NOTE: Updated, 12/4/2003 - Code samples in the download now include both VB.NET and C# page sets, and include a way to use a hyperlink by including the destination page on the querystring.
|