Миграция устаревшего ASP.NET в MVC 2 (RC): события HttpApplication не запускаются, основной пользователь является нулевым
проблема
Я пытаюсь взять существующее веб-приложение ASP.NET и вручную перенести его для использования MVC 2 (в настоящее время я использую RC). Я сделал несколько шагов (яЯ перечислю через мгновение) и, кажется, это работает, но потом я заметил, что могуустановитьAuthorizeAttribute
потому что пользователь является нулевым на контроллере. Затем я заметил, что когда я перехожу к действию, ни одно из HttpApplication 'Вызываются обычные события жизненного цикла (такие как BeginRequest и т. д.). Я полагаю, чтоВозможно, это связано с тем, что принципал пользователя имеет значение null Веб-хостом является локальный экземпляр IIS7 (на моей рабочей станции Vista).
Я создал новое веб-приложение MVC 2 для использования в качестве справочного материала при миграции. Он работает просто отлично, вызывая события приложения и заполняя принципал User, как я и ожидал.
Если ты'Вы чувствуете, что хотите наказать себя, читайте подробности (в меру своих возможностей) ниже.
Шаги миграции
Убедитесь, что пул приложений для каталога приложений .NET 2.0 и встроенныйСсылка System.Web.Abstractions (v.3.5.0.0), System.Web.routing (v3.5.0.0) и System.Web.Mvc (v2.0.0.0) в моем веб-проекте. Теперь я добавил System.Web.Mvc в качестве локальной ссылки, чтобы упростить интеграцию и развертывание.Модифицировал csproj для включения дополнения MVC VS (см.Эта статья)Добавлены каталоги Controllers и Views в проект, добавленные в /Views/web.config из моего примера приложения MVC.Модифицировал мой web.config (НОТА: У меня есть другое дерьмо в модулях и обработчиках, но я скрыл это для простоты и безопасности ... но они вполне могут быть частью проблемы):compilation
раздел:
pages
раздел:
system.webServer/modules
раздел (помните, IIS7 интегрирован):
system.webServer/handlers
раздел:
Обновил мой global.asax, чтобы регистрировать маршруты и игнорировать вещи, которые мешали бы моим устаревшим вещам:
private static void RegisterRoutes(RouteCollection routes)
{
// place any routes here you need to ignore, whether they
// be legacy or legitimate resources.
routes.IgnoreRoute(""); // i currently have functionality at "/", and this route frees up the root to be used by my Default.aspx
routes.IgnoreRoute("{webForms}.aspx/{*pathInfo}");
routes.IgnoreRoute("{webServices}.asmx/{*pathInfo}");
routes.IgnoreRoute("ajaxpro/{*pathInfo}");
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = ""} // Parameter defaults
);
}
protected void Application_Start()
{
// legacy crap here
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
Дополнительная информация
Я также использую последнюю версию Autofac (v1.4.5.676) и использую их обработчики веб-интеграции. Я'мы проверили оба пути, все автофакты полностью удалены / отключены и все настроено так, как я хочу; не влияет на проблему в любом случае.
Мы также попробовали это с моими специализированными супер сладкими настройками IgnoreRoute и без них. Нет эффекта.
Также я'Я хотел бы прояснить, что маршруты, кажется, работают, я отправляюсь на мои контроллеры и действия должным образом, у меня просто есть принципал Null на HttpContext.Current.User, и он, похоже, полностью не вызывает событий жизненного цикла приложения. Если бы я нея должен получить текущего участника или сделать какое-нибудь надоедливое разрешение, яникогда не знал, что что-то не так;)
И да, обычные страницы ASPX работают правильно, а события жизненного цикла приложения вызываются нормально.
Вот'Вот пример простого тестового контроллера, который я сделал и который не работает:
[Authorize]
public class FartsController : Controller
{
//
// GET: /Farts/
public ActionResult Index()
{
return View();
}
}
получая следующее исключение:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +48
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +35
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +103
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +316
System.Web.Mvc.Controller.ExecuteCore() +104
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +36
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.c__DisplayClass8.b__4() +34
System.Web.Mvc.Async.c__DisplayClass1.b__0() +21
System.Web.Mvc.Async.c__DisplayClass8`1.b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +53
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +43
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8678910
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Это отстой :(. Спасибо за чтение моего рассказа.