我正在将一个古老的经典asp项目迁移到ASP.NET,但是由于这是一件很大的老事,所以我会分块地进行。因此,我正处于需要他们共同努力的阶段。经典ASP和.NET的文件都在同一个项目中。旧的经典asp项目使用Session变量(新的.NET项目不使用),因此我尝试调用经典的ASP页来执行此操作。
这是经典的asp“桥梁”:
<!--#include virtual="/members/includes/db.config.asp" -->
<!--#include virtual="/members/includes/classes/clsLogin.asp" -->
<!--#include virtual="/members/includes/classes/clsAccess.asp" -->
<!--#include virtual="/members/includes/classes/clsUser.asp" -->
<!--#include virtual="/members/includes/classes/clsEntity.asp" -->
<!--#include virtual="/members/includes/classes/Database/clsDatabase.asp" -->
<!--#include virtual="/members/includes/classes/Helper/clsSessionVars.asp" -->
<!--#include virtual="/members/includes/classes/Helper/clsGlobal.asp" --><%'This file has global functions '%>
<%
Dim userId : userId = CStr(Request.QueryString("userId"))
Dim username : username = Cstr(Request.QueryString("username"))
Dim objAccess : Set objAccess = new clsAccess
Dim objDb : Set objDb = new clsDatabase
Dim objUser : Set objUser = new clsUser
Dim objLogin : Set objLogin = new clsLogin
Dim objEntity : Set objEntity = new clsEntity
'Set user session etc.
if(Request.QueryString("function") = "session") then
Dim userRecord : Set userRecord = objUser.GetUserById(userId)
Dim rsEntity : Set rsEntity = objEntity.GetById(userRecord("EntityId"))
'Login classic asp : Sets the session variables.
Call objLogin.LoginUser(userRecord, username, rsEntity)
'Kill the session i.e. Log out
elseif(Request.QueryString("function") = "kill") then
Session.Contents.RemoveAll()
Session.Abandon()
Response.Write("Session Killed")
End if
%>
但是,我遇到了真正的问题,无法从.NET Controller调用它并获取存储的会话变量。我尝试了FileWebRequest:
private void SetClassicASPSessionVars(ApplicationUser user)
{
try
{
string url = "~/members/includes/classes/aspbridge.asp" + "?function=session&userId=" + Url.Encode(user.UserId.ToString()) + "&username=" + Url.Encode(user.UserName);
Uri serverUri = new Uri(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUri);
request.Method = "POST";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
StreamReader reader = new StreamReader(response.GetResponseStream());
var content = reader.ReadToEnd();
}
}
catch (WebException we)
{
throw new InvalidOperationException("Error logging in user to classic asp system. User: " + user.UserId + ". Exception: " + we);
}
}
这仅读取文件,并且不执行脚本,因此它仅返回源代码,并且未创建会话变量。
我也尝试过HttpWebRequest:
try
{
string url = "/members/includes/classes/aspbridge.asp" + "?function=session&userId=" + Url.Encode(user.UserId.ToString()) + "&username=" + Url.Encode(user.UserName);
Uri serverUri = new Uri(url, UriKind.Absolute);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUri);
request.Method = "POST";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
StreamReader reader = new StreamReader(response.GetResponseStream());
var content = reader.ReadToEnd();
}
}
catch (WebException we)
{
throw new InvalidOperationException("Error logging in user to classic asp system. User: " + user.UserId + ". Exception: " + we);
}
但是,出现错误:无效的URI:无法确定URI的格式。
有人可以为我提供一些指导,让我了解如何使.NET控制器调用经典的ASP页。
在此先感谢,Rhys
您收到URI错误的原因是因为WebRequest
它不会发送到应用程序相对路径的请求,而是需要一个绝对路径。它基本上需要像标准Web浏览器那样到达URL。
因此,请确保您的URL具有完整的路径/主机:
string url = "http://localhost/members/includes/classes/aspbridge.asp" + "?function=session&userId=" + Url.Encode(user.UserId.ToString()) + "&username=" + Url.Encode(user.UserName);
我以localhost
这里为例。您显然希望将主机设置为与调用脚本相同的主机。
NOTE:
我仍然不确定这是否会完全完成您捕获.NET中的Classic ASP会话的目标,但这应该是一个更好的开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句