Вызов классического ASP из контроллера ASP.NET MVC5 на том же сервере

1

Я переношу старый классический проект asp на ASP.NET, но поскольку это такая большая вещь, я делаю это на куски. Поэтому я нахожусь на том этапе, когда мне нужно, чтобы они работали вместе. Файлы для классических asp и.NET находятся в одном проекте. В старом классическом проекте asp используются переменные сеанса (новый проект.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-контроллера и получения сохраненных переменных сеанса. Я попытался с 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.

Заранее спасибо, Рис

Теги:
asp.net-mvc
asp-classic
httpwebrequest

1 ответ

4
Лучший ответ

Причина, по которой вы получаете ошибку 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. Вы бы хотели установить хост на тот же хост, что и сценарий вызова.

NOTE: Я все еще не уверен, что это полностью выполнит ваше стремление к захвату классического сеанса ASP в.NET, но это должно стать лучшим началом.

  • 0
    Спасибо за это. Это не идеально, потому что мне нужно будет поместить URL-адрес в конфигурационный файл, чтобы обеспечить возможность разработки, тестирования и производства. Есть ли другой способ выполнить классическую страницу asp из .NET?
  • 0
    @RhysStephens Да, вы можете использовать Server.TransferRequest("Mypage.asp?id=1"); в контроллере (или представлении) - (тоже работает на Classic ASP). Но нужно помнить одну вещь: вы не сможете поделиться состоянием сеанса. Вместо этого вы можете рассмотреть использование файлов cookie, возможно даже файлов cookie базы данных, чтобы их можно было прочитать в разных средах. Удачи.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню