簡體   English   中英

從同一服務器上的ASP.NET MVC5控制器調用經典ASP

[英]Calling Classic ASP from ASP.NET MVC5 Controller on the same server

我正在將一個古老的經典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會話的目標,但這應該是一個更好的開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM