从同一台服务器上的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会话的反对意见,但这应该是一个更好的开始。
感谢您的支持。这并不理想,因为我必须将URL放在配置文件中才能进行开发,测试和生产设置。有没有其他的方法来从.NET执行经典的asp页面? – 2014-10-13 00:35:46
@Rysystephens是的,你可以在控制器(或视图)中使用'Server.TransferRequest(“Mypage.asp?id = 1”);'(也适用于Classic ASP)。但有一点要记住,你将无法共享会话状态。您可能需要考虑cookie,甚至可能是数据库cookie,因此可以在不同的环境中进行读取。祝你好运。 – 2014-10-14 07:40:57
非常感谢CF.我可以相信我没有想到这一点。 – 2014-10-15 10:18:20