在我的网站,因为我有很多资源,异步加载面板,压缩脚本和样式等每次我调试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应用程序中,事件只能被命中一次。
谢谢
您是否尝试过使用MyMethodFilterAttribute属性来装饰相应的控制器操作,而不是将其添加到全局筛选器集合中?例如,如果您装饰了“首页”控制器的“索引”操作,则在加载主页时,过滤器的代码只会被命中一次。 – elolos 2014-10-13 14:56:16
我希望这适用于任何地方,因为该项目有数百个控制器,它需要应用于所有“GET”操作。另外,我想从每次添加新控制器或操作时手动添加它的痛苦中解脱出来。 – Nick 2014-10-13 15:27:42
你说的话很有道理。你想从过滤器中排除多少百分比的'GET'动作?如果相对较低,则可以从相反的方向处理此问题,并创建一个“排除”属性来装饰这些操作。 – elolos 2014-10-13 15:46:59