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

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

问题描述:

我正在将一个旧的经典asp项目迁移到ASP.NET,但因为它是一件很古老的事情,所以我正在将它做成件。所以我正处于需要他们一起工作的阶段。 传统的asp和.NET文件都在同一个项目中。 旧的经典asp项目使用会话变量(新的.NET项目不),所以我试图调用一个经典的ASP页来做到这一点。从同一台服务器上的ASP.NET MVC5控制器调用经典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页面。

由于提前, 里斯

你得到的URI错误是因为WebRequest不发送的请求为相对路径到应用程序,而是需要一个绝对路径的原因。它基本上需要达到URL的标准Web浏览器会。

因此,请确保您的网址有一个完整的路径/主机:

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会话的反对意见,但这应该是一个更好的开始。

+0

感谢您的支持。这并不理想,因为我必须将URL放在配置文件中才能进行开发,测试和生产设置。有没有其他的方法来从.NET执行经典的asp页面? – 2014-10-13 00:35:46

+0

@Rysystephens是的,你可以在控制器(或视图)中使用'Server.TransferRequest(“Mypage.asp?id = 1”);'(也适用于Classic ASP)。但有一点要记住,你将无法共享会话状态。您可能需要考虑cookie,甚至可能是数据库cookie,因此可以在不同的环境中进行读取。祝你好运。 – 2014-10-14 07:40:57

+0

非常感谢CF.我可以相信我没有想到这一点。 – 2014-10-15 10:18:20