запрос на перенаправление не завершается после удаления сеанса или session.abandon

#asp.net #session #response.redirect

#asp.net #сеанс #ответ.перенаправление

Вопрос:

Я сталкиваюсь со своеобразной проблемой при перенаправлении после Session.Abandon , вот фрагмент кода

 if (Session["Login"] != null)
            {
                login = (LoginState)Session["Login"];
                if (!RoleValidation.ManagerRoleValidate(login.role_id))
                {
                    Session.Remove("Login");
                    Session.RemoveAll();
                    Session.Abandon();                       
                    Response.Redirect("~/Login.aspx");

                }
            }
  

здесь, если условие истинно, перенаправление занимает много времени… и на самом деле он вообще не перенаправляет на страницу, как будто она где-то застряла… поместил этот раздел в блок try catch, в нем говорится как

 Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack
  

Я не уверен, что является причиной этого. По какой причине это происходит?

Полный фрагмент кода :

      protected void Page_Load(object sender, EventArgs e)
    {

        if (Session["Login"] != null)
        {
            login = (LoginState)Session["Login"];
            if (!RoleValidation.ManagerRoleValidate(login.role_id))
            {
                Session.Remove("Login");
                Session.RemoveAll();
                Session.Abandon();
                Response.Redirect("~/Login.aspx", false);

            }
        }
        else
        {
            Response.Redirect("~/Login.aspx");
        }


    }
public static Boolean ManagerRoleValidate(String Role_id) 
{
    if (Role_id.Equals("1") || Role_id.Equals("2") || Role_id.Equals("4") || Role_id.Equals("999"))
    {
        return true;
    }
    else
    {
        return false;

    }
}
  

и в Login.aspx нет перенаправлений, чтобы он мог перенаправлять снова и снова.

Комментарии:

1. Этот код находится на главной странице? Является ли Login.aspx главной страницей содержимого?

2. @Sreekumar нет, это не на главной странице, это на дочерней странице

Ответ №1:

Возможно, причина может быть в Login.aspx также выполняется ваша эта часть кода, поэтому этот ответ будет перенаправляться на Login.aspx снова и снова.

Комментарии:

1. на странице входа в систему вообще нет перенаправлений. таким образом, нет никаких шансов, что он будет перенаправлять на запрошенный URL снова и снова.

Ответ №2:

не уверен, почему это вызвало проблему. я заменил

session.abandon

с

сеанс.очистить

метод, который очищает весь сеанс. хотя в global.asax я написал

 void Session_End(object sender, EventArgs e) 
{
    if (Request.Cookies["ASP.NET_SessionId"] != null)
    {
        Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddYears(-30);
    }

    Response.Redirect("~/Login.aspx"); 
}
  

после удаления строки

 Response.Redirect("~/Login.aspx"); 
  

из приведенного выше кода он должен был вызвать событие session_end внутри global.asax, но по какой-то причине потребовалась целая вечность, чтобы выполнить запрос. вот так я решил свою проблему. если кто-нибудь может, пожалуйста, объяснить, что здесь произошло и как вышеупомянутая вещь решила это. пожалуйста, ответьте, чтобы другие люди могли извлечь из этого пользу

Ответ №3:

В процессе находится другой запрос, и в то же время вы хотите другой запрос. Если вы добавите false, it will terminate the current request и перейдете на страницу входа.

 Response.Redirect("~/Login.aspx", false);
  

Эта проблема возникает чаще всего, если вы добавляете Response.Redirect инструкцию под Try Catch Block .

 try
    {
        Response.Redirect(""~/Login.aspx"); // here you want to redirect, but try catch is still have to complete, It will go in the Exception block
    }
    catch (Exception ex)
    {
        throw;
    }
  

Комментарии:

1. @Akhtar я уже пробовал, это все еще вызывает то же самое. 🙁 это не работает : (

2. Можете ли вы удалить блок try Catch и попробовать.

3. @Akhtar я удалил блок try catch : (он все тот же : (

4. Можете ли вы опубликовать полный блок кода? Я думаю, вам нужно использовать upper try catch где-нибудь

5. @Akhtar опубликовал полный фрагмент кода .. вы можете взглянуть на это