2014-10-10 56 views
1

我正在將一箇舊的經典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頁面。

由於提前, 里斯

回答

4

你得到的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