private void CreateControllerAndRunStartRequestFilters(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication) sender;
if (!IsMonoRailRequest(app.Context)) return;
IRailsEngineContext context = ObtainRailsEngineContext(app.Context);
Controller controller;
try
{
controller = CreateController(context);
}
catch(Exception ex)
{
IViewEngineManager viewEngineManager = context.GetService<IViewEngineManager>();
if (viewEngineManager.HasTemplate("rescues/404"))
{
viewEngineManager.Process(context, new Controller.EmptyController(context), "rescues/404");
IExceptionProcessor exProcessor = context.GetService<IExceptionProcessor>();
if (exProcessor != null)
{
exProcessor.ProcessException(ex);
}
app.Context.Response.End();
}
else
{
throw;
}
return;
}
IControllerLifecycleExecutor executor = CreateControllerExecutor(controller, context);
UrlInfo info = context.UrlInfo;
executor.InitializeController(info.Area, info.Controller, info.Action);
if (!executor.SelectAction(info.Action, info.Controller))
{
// Could not even select the action, stop here
return;
}
if (!executor.RunStartRequestFilters())
{
// Cancel request execution as
// one of the filters returned false
// We assume that the filter that stopped the request, also sent a redirect
// or something similar
context.UnderlyingContext.Response.End();
executor.Dispose();
}
}