IRouteHandler в веб-формах:Маршрутизация запросов, требующих HttpContext.User
-
20-09-2019 - |
Вопрос
Я пытаюсь добавить довольно простой маршрут к приложению веб-форм Asp.Net (работающему под IIS 7, интегрированный режим):для запросов, поступающих в http://mydomain.com/foo/ Я хотел бы показать результаты динамической страницы (http://mydomain.com/foopage.aspx).
Я создал RouteHandler, который делает все это, и, похоже, маршрутизация выполняется правильно.
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var page = System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath("~/foo.aspx", typeof(MyApp.Web.Foo)) as MyApp.Web.Foo;
return page as IHttpHandler;
}
Проблема в том, что внутри метода GetHttpHandler моего RouteHandler все экземпляры текущего пользователя (requestContext.HttpContext.User, System.Web.HttpContext.Current.User) имеют значение null.К сожалению, foo.aspx должен знать, кто является текущим пользователем (для элементов управления входом, ролей и т. д.), поэтому при рендеринге страницы выдаются исключения нулевых ссылок.Я предполагаю, что эти обработчики маршрутов срабатывают до того, как Asp.Net получит возможность подключить HttpContext к информации пользователя.Есть идеи обходного пути?
PS. Я понимаю, что этого можно добиться, выполнив Server.Transfer на странице по адресу http://mydomain.com/foo/default.aspx.Я бы хотел использовать маршрутизацию для подобных вещей, а не иметь кучу бесполезных папок, загромождающих все.
Спасибо!
Решение 2
Мне удалось это выяснить самому.
Так же, как этот вопрос, мои маршруты работали нормально, когда источник маршрута заканчивался на .aspx (http://mydomain.com/foo-origin.aspx), но потерпели неудачу, когда они этого не сделали (http://mydomain.com/foo-origin/).
Статья MSDN о настройке маршрутизации с помощью веб-форм. говорит вам внести несколько изменений в веб-конфигурацию, но не указывает, что вам нужно установить runAllManagedModulesForAllRequests значение true в узле модулей:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</system.webServer>
</configuration>
Теперь это работает плавно.
Другие советы
Смотрите ответ на этот вопрос, очень похоже.