Перенаправить на документ веб-приложения по умолчанию, когда указана другая страница? - PullRequest
2 голосов
/ 05 февраля 2010

IIS6, ASP.NET 2.0, без проверки подлинности с помощью форм

Я звоню в Response.Redirect ("~ / foo.aspx"), но для моего сайта появляется документ по умолчанию ("Default.aspx"). Что еще хуже, это происходит только с перерывами. Иногда редирект отображает правильную страницу.

Я проверил состояние сеанса и не вижу никаких значений в файле web.config (то есть я предполагаю, что я использую 20-минутные значения по умолчанию).

Хотелось бы, чтобы у меня было больше актуальной информации (я постараюсь ответить на любые вопросы).

Есть идеи? Почему он не перенаправляет на указанную страницу?

РЕДАКТИРОВАТЬ: Я посмотрел deeeeeper в код и узнал больше деталей.

Ok. Там есть foo.aspx и foo2.aspx (и документ по умолчанию, Default.aspx). Все страницы расширяются от BasePage, который расширяет страницу.

BasePage имеет свойство с именем ReturnPage:

protected string ReturnPage {
    get {
        if (Session["ReturnPage"] == null) {
            Session["ReturnPage"] = "";
        }
        return Session["ReturnPage"].ToString();
    }
    set { Session["ReturnPage"] = value; }
}

Пользователи нажимают на LinkButton на foo.aspx, и обработчик события click заканчивается двумя строками кода:

ReturnPage = ResolveUrl("~/foo.aspx");
Response.Redirect(ResolveUrl("~/foo2.aspx"));

Page_Load файла foo2.aspx имеет проблемы, и его обработка ошибок вызывает Response.Redirect (ReturnPage).

Когда я просматриваю заголовки ответов в foo2.aspx, местоположение 302 - это строка. Пусто (то есть ее нет). Тот же заголовок ответа имеет тот же идентификатор сеанса ASP.NET, что и ответ foo.aspx.

И помните - это с перебоями. Иногда вы можете нажать на эту LinkButton и без усилий перейти на foo2.aspx, без проблем. Вы можете обработать щелчок с точно такими же данными один раз, и он потерпит неудачу. Вы перейдете из документа по умолчанию (Default.aspx, куда вас отправил «баг») обратно в foo.aspx, снова щелкните с теми же данными (та же строка в таблице / таблице - тот же LinkButton, по существу), и вы будете перенаправлены на foo2.aspx без проблем.

Ответы [ 4 ]

1 голос
/ 05 февраля 2010

Размещение значения в сеансе непосредственно перед рискованным Response.Redirect ().

Изменение отклика foo.aspx Response.Redirect () на следующее может более надежно сохранить значение сеанса:

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

ОБНОВЛЕНИЕ: Это было исправлено только путем перемещения нашего состояния сеанса в SQL Server. См. Связанный вопрос: Почему / когда записи сеанса уязвимы для завершения потока?

0 голосов
/ 05 февраля 2010

После того как вы перенаправите и получите новый экземпляр BasePage из foo2.aspx, не станет ли это свойство ReturnPage снова нулевым? Затем, как только ваша страница загрузится с ошибками и попытается перенаправить ее, она получит доступ к пустой строке. Может быть, попытаться выбросить это свойство в сеансе

Session.Add("ReturnPage","~/foo.aspx") 

вместо

ReturnPage = ResolveUrl("~/foo.aspx");

Конечно, вам придется изменить обработку ошибок в загрузке страницы, чтобы захватить ее вне сеанса, а не свойства, и вам, возможно, придется переосмыслить, как весь редирект работает в вашей системе, если это окажется проблемой.

EDIT: Чтобы проверить эту идею о том, что свойство не задано или задано правильно .... (просто чтобы проверить, я не предлагаю вам жестко прописать путь там), измените ваш метод получения на приведенный ниже пример, а затем проверьте, оно работает. Надеюсь, это поможет, мне любопытно узнать, в чем проблема, если это не проблема.

get { 
   if (Session["ReturnPage"] == null) { 
        Session["ReturnPage"] = "~/foo.aspx"; 
    } 
    return Session["ReturnPage"].ToString(); 

} 
0 голосов
/ 05 февраля 2010

Я немного запутался здесь. Что именно вы пытаетесь достичь? Вы получаете документ по умолчанию именно потому, что 302 пуст. Ваше «непоследовательное» поведение почти наверняка связано с тем, как вы сохраняете данные в сеансе.

Реальная проблема здесь в том, почему вы перенаправляете, когда foo2.aspx «имеет проблемы». В чем здесь проблема? Зачем перенаправлять? Если вам действительно нужно перенаправить, почему цель перенаправления изменилась? Сделайте это статической страницей отчетов об ошибках, и все будет в порядке.

0 голосов
/ 05 февраля 2010

Когда вы говорите:

Иногда редирект отображает правильную страницу.

Это просто происходит, и вы не уверены, существуют ли определенные страницы, на которые влияет проблема? Если это так, то у вас, вероятно, есть проблема с адресацией. Вы можете использовать относительный путь или абсолютный путь, а не путь приложения. Я также предположил бы, что вы пытаетесь либо перейти на страницу из подкаталога на вашем сайте, либо в подкаталог на вашем сайте. Если вы решите придерживаться пути относительно приложения, убедитесь, что вы принимаете во внимание этот подкаталог. (напр .: ~ / FooPages / Foo.aspx)

Вот хорошая справочная страница, которую я только что нашел: http://nathanaeljones.com/129/types-of-asp-net-paths/

...