2014-10-10 41 views
0

在我的网站,因为我有很多资源,异步加载面板,压缩脚本和样式等每次我调试Global.asax中的BeginRequest方法,它往往会因为所有的内容请求被命中5或6次。MVC无法模拟处理“页面加载”请求的地方吗?

public MvcApplication() 
    { 
     BeginRequest += MvcApplication_BeginRequest; 
     EndRequest += MvcApplication_EndRequest; 
     AcquireRequestState += MvcApplication_AcquireRequestState; 
    } 

    private void MvcApplication_BeginRequest(object sender, EventArgs e) 
    { 
     var nHibernateContext = Ioc.ContainerWrapper.Resolve<INHibernateContext>(); 
     CurrentSessionContext.Bind(nHibernateContext.SessionFactory.OpenSession()); 

     MyMethodWithSomeComplexCookieLogic(); 
    } 

我想最好要取决于我会在页面上我MyMethodWithSomeComplexCookieLogic()要与每一个页面加载一次处理,而不是5或6倍。

有没有办法从所有较小的请求过滤主页BeginRequest?

另外还有什么地方可以移动这个逻辑来确保它在全局每页加载时处理一次?

我已经做了一些阅读,我找不到合适的解决方案。

我试图创建一个过滤器属性:

public class MyMethodFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext context) 
    { 
     base.OnResultExecuting(context); 

     /* my logic */ 
    } 
} 

我注册,在Global.asax中

private static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new MyMethodFilterAttribute()); 
    } 

但它被击中5或6倍。

MVC是否无法支持与Page_Load类似的功能? 在一个经典的.NET应用程序中,事件只能被命中一次。

谢谢

+0

您是否尝试过使用MyMethodFilterAttribute属性来装饰相应的控制器操作,而不是将其添加到全局筛选器集合中?例如,如果您装饰了“首页”控制器的“索引”操作,则在加载主页时,过滤器的代码只会被命中一次。 – elolos 2014-10-13 14:56:16

+0

我希望这适用于任何地方,因为该项目有数百个控制器,它需要应用于所有“GET”操作。另外,我想从每次添加新控制器或操作时手动添加它的痛苦中解脱出来。 – Nick 2014-10-13 15:27:42

+0

你说的话很有道理。你想从过滤器中排除多少百分比的'GET'动作?如果相对较低,则可以从相反的方向处理此问题,并创建一个“排除”属性来装饰这些操作。 – elolos 2014-10-13 15:46:59

回答

0

在MVC中,动作过滤器是这类事情的正确位置。

您对静态文件的请求不应该触及操作筛选器,因为它们不会通过控制器操作进行路由。这会让你面对你的AJAX请求问题。简单的解决方法是做到以下几点:

public class MyMethodFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext context) 
    { 
     if(!context.HttpContext.Request.IsAjaxRequest()) 
     { 
      // Your logic 
     } 

     base.OnResultExecuting(context); 
    } 
} 

您现在应该能够某个地方你的逻辑中断点,只有它击中非AJAX请求。

+0

有希望,但我相信不是所有的请求都是Ajax请求。有些适用于JavaScript文件,或样式表和图像。我会检查这个,很快会确认 – Nick 2014-10-13 15:06:08

+0

它毕竟有效! – Nick 2014-10-13 15:30:57