Как сделать server.transfer() с ответом.AddHeader(“обновить”, “секунды”) и не получить ошибку 404?
-
20-09-2019 - |
Вопрос
итак, это сценарий:
У меня есть базовый класс для всех страниц, контролируемых входом в систему:
public class SessionControlledPage : Page
{
protected virtual void Page_Load(Object sender, EventArgs e)
{
Response.AddHeader("Refresh", Convert.ToString(Session.Timeout * 60 + 5));
if (Session.IsNewSession)
{
Response.Redirect("~/login.aspx");
}
}
}
И a regularpage.aspx
страница, наследуемая от базового класса:
public partial class RegularPage : SessionControlledPage
{
override protected void Page_Load(Object sender, EventArgs e)
{
base.Page_Load(sender, e);
Server.Transfer("~/otherpage.aspx");
}
}
Теперь предположим, что исходный URL был http://localhost/regularpage.aspx и это Session.Timeout = 5
.Проблема появляется, когда обновление происходит после выполнения переноса.Я получаю 404 Not Found
ошибка и URL-адрес изменяется для http://localhost/305.Обратите внимание , что 5 * 60 + 5 = 305
.
Вы знаете, почему это происходит?есть решение?
ПД:Я использую transfer, потому что мне нужно получить доступ к некоторым свойствам regularpage.aspx в otherpage.aspx, возможно, вы могли бы предоставить другое решение и для этого.
Решение
Существует очень мало причин вызывать base.Page_Load если все, что вы собираетесь сделать, это вызвать Server.Передача.Чего именно вы пытаетесь достичь?Если вы просто обращаетесь к некоторым свойствам, вам нужно абстрагировать это в некоторую бизнес-логику, которая не зависит от объекта Page.
Это также является причиной проблемы 404...чтобы это произошло, проблема должна быть в отображаемых выходных данных страницы (проверьте это).Похоже, что вы отключаете одну страницу сразу после тега meta-refresh, а затем запускаете новую страницу и ASP.NET просто сбрасываете все это в один и тот же поток ответов.Короче говоря, вы делаете это неправильно.:) Возможно, вы сможете исправить это с помощью правильно размещенного ответа.Clear(), но настоящая проблема здесь не в этом...и вы потеряете свой тег обновления.