Ответ 1
Конвейер HttpRequestBegin подключен к событию HttpApplication.BeginRequest, и это событие запускается до того, как объект HttpSession был создан. Использование конвейера HttpRequestEnd не работает, потому что объект HttpSession уже был удален к моменту запуска события HttpApplication.EndRequest.
Сессия становится доступной после запуска события PostAcquireRequestState. Чтобы перехватить это, создайте класс, реализующий IHttpModule, и добавьте его в <httpModules> элемент в Web.config. Код HttpModule должен будет проверить, требует ли запрос состояние сеанса, поскольку попытка прочитать сеанс для запроса статического ресурса вызовет исключение.
Вот код HttpModule, который обращается к Session и QueryString:
public class MyHttpModule :IHttpModule
{
public void Init(HttpApplication context)
{
context.PostAcquireRequestState += RequestHandler;
}
public void Dispose()
{
//
}
public void RequestHandler(object sender, EventArgs e)
{
var app = (HttpApplication) sender;
if (app.Context.Handler is IRequiresSessionState)
{
var session = app.Session;
var queryString = app.Request.QueryString["test"];
session["test"] = queryString;
}
}
}
Стоит отметить, что конвейеры Sitecore HttpRequestBegin и HttpRequestEnd подключены к ASP.NET через HttpModule:
<add type="Sitecore.Nexus.Web.HttpModule,Sitecore.Nexus"
name="SitecoreHttpModule" />
Спасибо @ddysart за то, что указали мне в правильном направлении, и этот ответ за правильное событие для прослушивания.