.net MVC是否无法模仿一个地方来处理;“页面加载”;要求

.net MVC是否无法模仿一个地方来处理;“页面加载”;要求,.net,asp.net-mvc-4,c#-4.0,global-asax,.net,Asp.net Mvc 4,C# 4.0,Global Asax,在我的站点中,因为我有很多资源、异步加载的面板、压缩的脚本和样式等,所以每次调试Global.asax中的BeginRequest方法时,由于所有内容请求,它往往会被命中5到6次 public MvcApplication() { BeginRequest += MvcApplication_BeginRequest; EndRequest += MvcApplication_EndRequest; AcquireRequestSt

在我的站点中,因为我有很多资源、异步加载的面板、压缩的脚本和样式等,所以每次调试Global.asax中的BeginRequest方法时,由于所有内容请求,它往往会被命中5到6次

    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();
    }
我在Global.asax上注册了

    private static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new MyMethodFilterAttribute());
    }
但它会被击中5到6次

MVC是否无法支持与页面加载类似的功能? 在经典的.NET应用程序中,事件只命中一次


谢谢你

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

您对静态文件的请求不应该命中操作筛选器,因为它们不会通过控制器操作路由。这就给您留下了AJAX请求的问题。解决此问题的简单方法是执行以下操作:

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

        base.OnResultExecuting(context);
    }
}

现在,您应该能够在逻辑中的某个位置放置断点,并且只在非AJAX请求中命中断点。

您是否尝试过使用
MyMethodFilterAttribute
属性仅修饰适当的控制器操作,而不是将其添加到全局筛选器集合中?例如,如果您装饰
主页
控制器的
索引
操作,则加载主页时过滤器的代码只会被点击一次。我希望这适用于所有地方,因为项目有数百个控制器,需要应用于所有“获取”操作。另外,我想让我们免于每次添加新控制器或操作时手动包含它的痛苦。你说的很有道理。您希望从筛选器中排除多少百分比的
GET
操作?如果它相对较低,您可以从相反的方向进行处理,并创建一个“exclude”属性来修饰这些操作。有些用于javascript文件、样式表和图像。我会检查一下,很快会确认
    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();
    }