#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 опубликовал полный фрагмент кода .. вы можете взглянуть на это