How do u set classic ASP session variables from an ASP.NET application???


C

Chris Newby

My project currently requires that I integrate an ASP.NET application with
an ASP application. One of the issues I'm having is that I have some very
long strings being created in an ASP.NET application that need to somehow
appear in a classic ASP session. The strings are too long for cookies or
URLs and I'd like to avoid using a database or someother temporary server
storage.

So far what I've come up with is a .NET class that "spoofs" a post to an ASP
page specifically designed to load its post data into the session. The post
spoof involves a System.NET.HTTPWebRequest object, copying the HTTP headers
from HTTPContext.Current.Request, and creating a post data byte array.

What i've found so far is that even though it would appear my HTTPWebRequest
object has a cookie in its headers containing the ASP session identifier for
an already established ASP session, the request causes a new ASP session to
be created. Also, it appears that my post data isn't making it to the ASP
page that is responsible for mapping the post data into the ASP session.

Any advice or information would be greatly apreciated//

Below is the source code from my current class
============================================================
/// <summary>
/// <c>ASPSession</c> is an adapter for moving data from the .NET runtime
to a traditional ASP session
/// This is accomplished by maintaining a local collection of name-value
pairs, then including these pairs in
/// a POST request to a traditional ASP page that is ultimately responsible
for committing the name-value pairs to an ASP session
/// ** this means that in order to function correctly, this class requires
the existence of the described receiver ASP page
///
/// Sample VBScript code for ASP receiver page
/// <%
///
/// for each formKey in Request.Form
/// if ( InStr( Upper( formKey ), "SESSIONKEY." ) ) then
/// session( Replace( Upper( formKey ), "SESSIONKEY.", "" ) ) =
Request.Form( formKey )
/// end if
/// next
///
/// %>
/// </summary>
public class ASPSession
{

#region Fields

private const String _ASP_RECEIVER_PAGE = "RuntimeToSessionReceiver.asp";
private const String _ASP_RECEIVER_CONTENTTYPE =
"application/x-www-form-urlencoded";
private const String _ASP_SESSIONKEY_POST_PREFIX = "SessionKey.";
private StringDictionary _aspSessionValues;
private HttpWebRequest _aspReceiverRequest;

#endregion

#region Constructors

/// <summary>
/// Creates a new instance of ASPSession
/// </summary>
public ASPSession()
{
_aspSessionValues = new StringDictionary();
configureASPReceiverRequest();
}

#endregion

#region Public Members

/// <summary>
/// Gets or Sets name-value pairs for submission to an existing ASP
session
/// </summary>
public String this[ String ASPSessionKeyName ]
{
get
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
return _aspSessionValues[ ASPSessionKeyName ];
}
else
{
return null;
}
}
set
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
_aspSessionValues[ ASPSessionKeyName ] = value;
}
else
{
_aspSessionValues.Add( ASPSessionKeyName, value );
}
}
}

/// <summary>
/// Executes an HTTP POST request containing the current collection of
name-value pairs to the ASP receiver page
/// * If it is determined that there are no name-value pairs to post, no
request is made.
/// </summary>
public void SetVars()
{
if( _aspSessionValues.Count > 0 )
{
setHeaders();
Byte[] postData = getPostData();
if( postData != null )
{
_aspReceiverRequest.ContentLength = postData.Length;
Stream sendStream = _aspReceiverRequest.GetRequestStream();
sendStream.Write( postData, 0, postData.Length );
sendStream.Close();
HttpWebResponse response = ( HttpWebResponse )
_aspReceiverRequest.GetResponse();
StreamReader reader = new StreamReader( response.GetResponseStream() );
String test = reader.ReadToEnd();
reader.Close();
}
}
}

#endregion

#region Private members

private void configureASPReceiverRequest()
{
String receiverURL;
if( String.Compare( HttpContext.Current.Request.ServerVariables[
"HTTPS" ], "on", true ) == 0 )
{
receiverURL = "https://";
}
else
{
receiverURL = "http://";
}
receiverURL += HttpContext.Current.Request.Url.Host + "/" +
_ASP_RECEIVER_PAGE;
_aspReceiverRequest = (
HttpWebRequest )System.Net.HttpWebRequest.Create( receiverURL );
_aspReceiverRequest.ContentType = _ASP_RECEIVER_CONTENTTYPE;
_aspReceiverRequest.Method = "POST";
}

private void setHeaders()
{
_aspReceiverRequest.Headers.Clear();
foreach( String headerName in HttpContext.Current.Request.Headers )
{
try
{
_aspReceiverRequest.Headers.Add( headerName,
HttpContext.Current.Request.Headers[ headerName ] );
}
catch( ArgumentException )
{
// Some headers are restricted (why, i'm not sure) and will cause an
ArgumentException to occur
}
}
}

private Byte[] getPostData()
{
String sessionKey;
String postDataString = String.Empty;
foreach( DictionaryEntry aspSessionEntry in _aspSessionValues )
{
sessionKey = aspSessionEntry.Key.ToString();
if( sessionKey.Length > 0 )
{
postDataString += String.Format(
"&{0}={1}",
HttpUtility.UrlEncode( String.Format( "{0}{1}",
_ASP_SESSIONKEY_POST_PREFIX, sessionKey ) ),
HttpUtility.UrlEncode( aspSessionEntry.Value.ToString() )
);
}
}
if( postDataString.Length == 0 ) return null;
postDataString = postDataString.Substring( 1 );
return Encoding.ASCII.GetBytes( postDataString );
}

#endregion

}
 
Ad

Advertisements

J

Juan T. Llibre

Please read the following MSDN article and adapt the sample code.

"How to Share Session State Between Classic ASP and ASP.NET"
By Billy Yuen, Microsoft Corporation
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp



Juan T. Llibre
ASP.NET MVP
http://asp.net.do/foros/
Foros de ASP.NET en Español
Ven, y hablemos de ASP.NET...
======================

Chris Newby said:
My project currently requires that I integrate an ASP.NET application with
an ASP application. One of the issues I'm having is that I have some very
long strings being created in an ASP.NET application that need to somehow
appear in a classic ASP session. The strings are too long for cookies or
URLs and I'd like to avoid using a database or someother temporary server
storage.

So far what I've come up with is a .NET class that "spoofs" a post to an
ASP
page specifically designed to load its post data into the session. The
post
spoof involves a System.NET.HTTPWebRequest object, copying the HTTP
headers
from HTTPContext.Current.Request, and creating a post data byte array.

What i've found so far is that even though it would appear my
HTTPWebRequest
object has a cookie in its headers containing the ASP session identifier
for
an already established ASP session, the request causes a new ASP session
to
be created. Also, it appears that my post data isn't making it to the ASP
page that is responsible for mapping the post data into the ASP session.

Any advice or information would be greatly apreciated//

Below is the source code from my current class
============================================================
/// <summary>
/// <c>ASPSession</c> is an adapter for moving data from the .NET runtime
to a traditional ASP session
/// This is accomplished by maintaining a local collection of name-value
pairs, then including these pairs in
/// a POST request to a traditional ASP page that is ultimately
responsible
for committing the name-value pairs to an ASP session
/// ** this means that in order to function correctly, this class requires
the existence of the described receiver ASP page
///
/// Sample VBScript code for ASP receiver page
/// <%
///
/// for each formKey in Request.Form
/// if ( InStr( Upper( formKey ), "SESSIONKEY." ) ) then
/// session( Replace( Upper( formKey ), "SESSIONKEY.", "" ) ) =
Request.Form( formKey )
/// end if
/// next
///
/// %>
/// </summary>
public class ASPSession
{

#region Fields

private const String _ASP_RECEIVER_PAGE = "RuntimeToSessionReceiver.asp";
private const String _ASP_RECEIVER_CONTENTTYPE =
"application/x-www-form-urlencoded";
private const String _ASP_SESSIONKEY_POST_PREFIX = "SessionKey.";
private StringDictionary _aspSessionValues;
private HttpWebRequest _aspReceiverRequest;

#endregion

#region Constructors

/// <summary>
/// Creates a new instance of ASPSession
/// </summary>
public ASPSession()
{
_aspSessionValues = new StringDictionary();
configureASPReceiverRequest();
}

#endregion

#region Public Members

/// <summary>
/// Gets or Sets name-value pairs for submission to an existing ASP
session
/// </summary>
public String this[ String ASPSessionKeyName ]
{
get
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
return _aspSessionValues[ ASPSessionKeyName ];
}
else
{
return null;
}
}
set
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
_aspSessionValues[ ASPSessionKeyName ] = value;
}
else
{
_aspSessionValues.Add( ASPSessionKeyName, value );
}
}
}

/// <summary>
/// Executes an HTTP POST request containing the current collection of
name-value pairs to the ASP receiver page
/// * If it is determined that there are no name-value pairs to post, no
request is made.
/// </summary>
public void SetVars()
{
if( _aspSessionValues.Count > 0 )
{
setHeaders();
Byte[] postData = getPostData();
if( postData != null )
{
_aspReceiverRequest.ContentLength = postData.Length;
Stream sendStream = _aspReceiverRequest.GetRequestStream();
sendStream.Write( postData, 0, postData.Length );
sendStream.Close();
HttpWebResponse response = ( HttpWebResponse )
_aspReceiverRequest.GetResponse();
StreamReader reader = new StreamReader(
response.GetResponseStream() );
String test = reader.ReadToEnd();
reader.Close();
}
}
}

#endregion

#region Private members

private void configureASPReceiverRequest()
{
String receiverURL;
if( String.Compare( HttpContext.Current.Request.ServerVariables[
"HTTPS" ], "on", true ) == 0 )
{
receiverURL = "https://";
}
else
{
receiverURL = "http://";
}
receiverURL += HttpContext.Current.Request.Url.Host + "/" +
_ASP_RECEIVER_PAGE;
_aspReceiverRequest = (
HttpWebRequest )System.Net.HttpWebRequest.Create( receiverURL );
_aspReceiverRequest.ContentType = _ASP_RECEIVER_CONTENTTYPE;
_aspReceiverRequest.Method = "POST";
}

private void setHeaders()
{
_aspReceiverRequest.Headers.Clear();
foreach( String headerName in HttpContext.Current.Request.Headers )
{
try
{
_aspReceiverRequest.Headers.Add( headerName,
HttpContext.Current.Request.Headers[ headerName ] );
}
catch( ArgumentException )
{
// Some headers are restricted (why, i'm not sure) and will cause an
ArgumentException to occur
}
}
}

private Byte[] getPostData()
{
String sessionKey;
String postDataString = String.Empty;
foreach( DictionaryEntry aspSessionEntry in _aspSessionValues )
{
sessionKey = aspSessionEntry.Key.ToString();
if( sessionKey.Length > 0 )
{
postDataString += String.Format(
"&{0}={1}",
HttpUtility.UrlEncode( String.Format( "{0}{1}",
_ASP_SESSIONKEY_POST_PREFIX, sessionKey ) ),
HttpUtility.UrlEncode( aspSessionEntry.Value.ToString() )
);
}
}
if( postDataString.Length == 0 ) return null;
postDataString = postDataString.Substring( 1 );
return Encoding.ASCII.GetBytes( postDataString );
}

#endregion

}
 
Ad

Advertisements

S

Steve C. Orr [MVP, MCSD]

You could use a 3rd party product such as this:
http://www.consonica.com/solutions/statestitch/

Or you can transfer values via a common database, or you can transfer values
between the two systems vai querystring, or posting hidden fields, etc.
Here's more information:
http://www.eggheadcafe.com/articles/20021207.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp

--
I hope this helps,
Steve C. Orr, MCSD, MVP
http://SteveOrr.net


Chris Newby said:
My project currently requires that I integrate an ASP.NET application with
an ASP application. One of the issues I'm having is that I have some very
long strings being created in an ASP.NET application that need to somehow
appear in a classic ASP session. The strings are too long for cookies or
URLs and I'd like to avoid using a database or someother temporary server
storage.

So far what I've come up with is a .NET class that "spoofs" a post to an
ASP
page specifically designed to load its post data into the session. The
post
spoof involves a System.NET.HTTPWebRequest object, copying the HTTP
headers
from HTTPContext.Current.Request, and creating a post data byte array.

What i've found so far is that even though it would appear my
HTTPWebRequest
object has a cookie in its headers containing the ASP session identifier
for
an already established ASP session, the request causes a new ASP session
to
be created. Also, it appears that my post data isn't making it to the ASP
page that is responsible for mapping the post data into the ASP session.

Any advice or information would be greatly apreciated//

Below is the source code from my current class
============================================================
/// <summary>
/// <c>ASPSession</c> is an adapter for moving data from the .NET runtime
to a traditional ASP session
/// This is accomplished by maintaining a local collection of name-value
pairs, then including these pairs in
/// a POST request to a traditional ASP page that is ultimately
responsible
for committing the name-value pairs to an ASP session
/// ** this means that in order to function correctly, this class requires
the existence of the described receiver ASP page
///
/// Sample VBScript code for ASP receiver page
/// <%
///
/// for each formKey in Request.Form
/// if ( InStr( Upper( formKey ), "SESSIONKEY." ) ) then
/// session( Replace( Upper( formKey ), "SESSIONKEY.", "" ) ) =
Request.Form( formKey )
/// end if
/// next
///
/// %>
/// </summary>
public class ASPSession
{

#region Fields

private const String _ASP_RECEIVER_PAGE = "RuntimeToSessionReceiver.asp";
private const String _ASP_RECEIVER_CONTENTTYPE =
"application/x-www-form-urlencoded";
private const String _ASP_SESSIONKEY_POST_PREFIX = "SessionKey.";
private StringDictionary _aspSessionValues;
private HttpWebRequest _aspReceiverRequest;

#endregion

#region Constructors

/// <summary>
/// Creates a new instance of ASPSession
/// </summary>
public ASPSession()
{
_aspSessionValues = new StringDictionary();
configureASPReceiverRequest();
}

#endregion

#region Public Members

/// <summary>
/// Gets or Sets name-value pairs for submission to an existing ASP
session
/// </summary>
public String this[ String ASPSessionKeyName ]
{
get
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
return _aspSessionValues[ ASPSessionKeyName ];
}
else
{
return null;
}
}
set
{
if( _aspSessionValues.ContainsKey( ASPSessionKeyName ) )
{
_aspSessionValues[ ASPSessionKeyName ] = value;
}
else
{
_aspSessionValues.Add( ASPSessionKeyName, value );
}
}
}

/// <summary>
/// Executes an HTTP POST request containing the current collection of
name-value pairs to the ASP receiver page
/// * If it is determined that there are no name-value pairs to post, no
request is made.
/// </summary>
public void SetVars()
{
if( _aspSessionValues.Count > 0 )
{
setHeaders();
Byte[] postData = getPostData();
if( postData != null )
{
_aspReceiverRequest.ContentLength = postData.Length;
Stream sendStream = _aspReceiverRequest.GetRequestStream();
sendStream.Write( postData, 0, postData.Length );
sendStream.Close();
HttpWebResponse response = ( HttpWebResponse )
_aspReceiverRequest.GetResponse();
StreamReader reader = new StreamReader(
response.GetResponseStream() );
String test = reader.ReadToEnd();
reader.Close();
}
}
}

#endregion

#region Private members

private void configureASPReceiverRequest()
{
String receiverURL;
if( String.Compare( HttpContext.Current.Request.ServerVariables[
"HTTPS" ], "on", true ) == 0 )
{
receiverURL = "https://";
}
else
{
receiverURL = "http://";
}
receiverURL += HttpContext.Current.Request.Url.Host + "/" +
_ASP_RECEIVER_PAGE;
_aspReceiverRequest = (
HttpWebRequest )System.Net.HttpWebRequest.Create( receiverURL );
_aspReceiverRequest.ContentType = _ASP_RECEIVER_CONTENTTYPE;
_aspReceiverRequest.Method = "POST";
}

private void setHeaders()
{
_aspReceiverRequest.Headers.Clear();
foreach( String headerName in HttpContext.Current.Request.Headers )
{
try
{
_aspReceiverRequest.Headers.Add( headerName,
HttpContext.Current.Request.Headers[ headerName ] );
}
catch( ArgumentException )
{
// Some headers are restricted (why, i'm not sure) and will cause an
ArgumentException to occur
}
}
}

private Byte[] getPostData()
{
String sessionKey;
String postDataString = String.Empty;
foreach( DictionaryEntry aspSessionEntry in _aspSessionValues )
{
sessionKey = aspSessionEntry.Key.ToString();
if( sessionKey.Length > 0 )
{
postDataString += String.Format(
"&{0}={1}",
HttpUtility.UrlEncode( String.Format( "{0}{1}",
_ASP_SESSIONKEY_POST_PREFIX, sessionKey ) ),
HttpUtility.UrlEncode( aspSessionEntry.Value.ToString() )
);
}
}
if( postDataString.Length == 0 ) return null;
postDataString = postDataString.Substring( 1 );
return Encoding.ASCII.GetBytes( postDataString );
}

#endregion

}
 

Top