gpt4 book ai didi

c# - 从同一台服务器上的 ASP.NET MVC5 Controller 调用经典 ASP

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:15 26 4
gpt4 key购买 nike

我正在将一个旧的经典 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 调用它并获取存储的 session 变量方面遇到了真正的问题。我尝试使用 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);
}
}

这里只读文件,不执行脚本,所以只返回源代码,不创建 session 变量。

我也尝试过使用 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 Controller 调用经典的 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 作为例子。您显然希望将主机设置为与调用脚本相同的主机。

注意:我仍然不确定这是否会完全实现您反对在 .NET 中捕获经典 ASP session 的反对意见,但这应该是一个更好的开始。

关于c# - 从同一台服务器上的 ASP.NET MVC5 Controller 调用经典 ASP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com