从同一服务器上的ASP.NET MVC5控制器调用Classic ASP

本文关键字:ASP NET MVC5 调用 Classic 控制器 服务器 | 更新日期: 2023-09-27 18:26:14

我正在将一个旧的经典asp项目迁移到asp.NET,但由于它是一个很大的老项目,所以我正在分块进行。因此,我正处于一个需要他们共同努力的阶段。经典的asp和.NET的文件都在同一个项目中。旧的经典asp项目使用会话变量(新的.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控制器调用它并存储会话变量时遇到了实际问题。我尝试使用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

从同一服务器上的ASP.NET MVC5控制器调用Classic ASP

出现URI错误的原因是WebRequest不会将请求发送到应用程序的相对路径,而是需要一个绝对路径。它基本上需要像标准的网络浏览器一样访问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中捕获经典ASP会话的目标,但这应该是一个更好的开始。