IRouteHandler в веб-формах: маршрутизация запросов, для которых требуется HttpContext.User - PullRequest
2 голосов
/ 08 октября 2009

Я пытаюсь добавить довольно простой маршрут в приложение Asp.Net Web Forms (работает под управлением 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) равны нулю. К сожалению, foo.aspx должен знать, кто является текущим пользователем (для элементов управления входом в систему, для ролевой работы и т. Д.), Поэтому при рендеринге страницы выдается исключение нулевой ссылки. Я предполагаю, что эти обработчики маршрутов срабатывают до того, как Asp.Net получит возможность связать HttpContext с информацией о пользователе. Есть идеи обойти?

PS - я понимаю, что это можно сделать, выполнив Server.Transfer на странице по адресу http://mydomain.com/foo/default.aspx. Я бы хотел использовать маршрутизацию для такого рода вещей, а не с кучей бесполезных папок, загромождающих вещи .

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2009

Мне удалось выяснить это самому.

Так же, как этот вопрос , мои маршруты работали очень хорошо, когда начало маршрута заканчивалось на .aspx (http://mydomain.com/foo-origin.aspx),, но не получалось, когда их не было (http://mydomain.com/foo-origin/).

В статье MSDN о настройке маршрутизации с веб-формами говорится, что вы должны внести несколько изменений в веб-конфигурацию, но не требуется указывать runAllManagedModulesForAllRequests в true для модулей узел:

<configuration>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
  </system.webServer>
</configuration>

Теперь все работает плавно.

0 голосов
/ 08 октября 2009

См. Ответ на этот вопрос, очень похожий.

...