То, что я пытаюсь сделать, прост в принципе, но жизненный цикл страниц ASP.NET бросает в мой контейнер ведро с холодной водой.Какую переменную я могу использовать для этого?
Вот проблема
Мы реализовали URL перенаправления, и я унаследовал код, который читается как это в global.asax, на Sub Application_BeginRequest:
dv.Table = CommonFunctions.ConvertXmlFileToDataSet("/XmlData/WebAppFolders.xml").Tables("Application")
dv.RowFilter = "'" + fullOrigionalPath + "' LIKE '%'+ folder + '%'"
If dv.Count > 0 Then 'match on key to redirect
If fullOrigionalPath.EndsWith(dv(0)("folder") + "/") Then
Context.RewritePath(dv(0)("basePage"), True)
Else 'missing page in directory --> redirect
HttpContext.Current.Items("Raise404") = "true"
Response.Redirect("/" + dv(0)("folder"))
End If
Return
End If
В основном мы читаем большой XML файл, содержащий перенаправления URL-адресов. Это нормально. Проблема происходит в линии ...
HttpContext.Current.Items («Raise404») = «истинный»
В контексте Application_BeginRequest, объект сеанса еще не доступен, так что я не мог использовать он должен хранить флаг, который я назвал Raise404. Вместо этого мне пришлось прибегать к использованию коллекции Items.
Проблема возникает при перенаправлении. Новый жизненный цикл страницы уничтожает массив Items и перезаписывает его новым пустым.
К тому времени, когда я пытаюсь использовать свой флаг Raise404, его больше не существует на моей странице PreRender.
Усложняет дело мы используем мастер-страницы, и поэтому мне было предложено разместить код, который мы хотим выполнить в главной странице
В идеале, если массив Items не разрушалась, этот код будет работать :
Private Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
If HttpContext.Current.Items("Raise404") IsNot Nothing AndAlso HttpContext.Current.Items("Raise404").Equals("true") Then
Response.StatusCode = 404
HttpContext.Current.Items("Raise404") = Nothing
End If
End Sub
Я не уверен, какую переменную я мог бы использовать для хранения моего флага и позволить ему пережить перенаправление.
Любые идеи?
Обновление: проблема заключается в том, что обработчик HTTP, обслуживающий мой запрос, является System.Web.DefaultHTTPHandler, который не реализует IRequiresSessionState, и поэтому, когда мой запрос обрабатывается внутри Global ASAX, сеанс не создается. Таким образом, похоже, что решение будет заключаться в написании пользовательского HTTPHandler, который реализует IRequiresSessionState, и использовать его для всех моих .aspx-файлов. Даже тогда состояние сеанса не создается в Global.ASAX до тех пор, пока не будет поднято PreRequestHandlerExecute. Итак, соединяя все вместе, мне кажется, мне нужно написать собственный обработчик HTTP, который реализует IRequiresSessionState, и задерживает перенаправление страницы до тех пор, пока не будет поднят PreRequestHandlerExecute, где я смогу сохранить свой флаг в состоянии сеанса, и только после этого, перенаправить мою страницу.
Не очень элегантный, и мне интересно, будут ли какие-либо последствия для производительности.
Да, это пришло в голову, но, к сожалению, у меня есть требование никогда не использовать querystrings :( –