1

为了给这个问题提供一些背景信息,我编写了一个在 Application_BeginRequest 上调用的分析器,但它记录了所有内容(即 javascript、图像等)。虽然可以将过滤添加到分析器客户端作为最后的手段,但我更愿意仅在可以确定请求需要路由时才激活分析器。理想情况下,它会在 Application_BeginRequest 中,但我认为如果不对传入的路由请求进行冗余处理,这是不可能的......

简而言之,我可以确定请求是否针对静态资源的请求生命周期中最早的时间点是什么时候,您将如何处理?

是否有可能从 System.Web.Routing.RouteTable 派生或挂钩并从那里调用我的探查器代码?

4

3 回答 3

2

有多种选择。首先 - 使用 Request.PhysicalPath 确定静态文件 - 签出: 在 Application_BeginRequest 期间检查静态文件?

一种替代方法是将其作为处理程序并使用路径来记录要包含的文件类型 (*.aspx),例如在 web.config 中。然后您可以很早就可以访问事件(请参阅 asp.net 管道)

或者只使用 httpmodule - 检查所有内容并仅分析您提到的非物理项目。

或者 - 使用您当前的方法和第一个链接来简单地检查 Request.PhysicalPath 并希望这对您有用:)

于 2011-07-26T04:06:57.957 回答
2

我宁愿使用MVC 过滤器进行分析,因为 MVC 过滤器允许添加预处理和后处理行为,并且filterContext参数应该为您提供足够的信息。

例如,我会为分析创建 ProfilerAttribute

public class ProfilerAttribute : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter {
    public void OnActionExecuting(ActionExecutingContext filterContext) {
        Debug.WriteLine("Before Action is executing");
    }

    public void OnActionExecuted(ActionExecutedContext filterContext) {
        Debug.WriteLine("After Action is executed");
    }

    public void OnResultExecuted(ResultExecutedContext filterContext) {
        Debug.WriteLine("After Action Result is executed");            
    }

    public void OnResultExecuting(ResultExecutingContext filterContext) {
        Debug.WriteLine("Before Action Result is executing");
    }

    public void OnException(ExceptionContext filterContext) {
        Debug.WriteLine("oops! exception");
    }
}

并在Global.ascx中注册为GlobalFilter ....

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new HandleErrorAttribute());
    filters.Add(new ProfilerAttribute());
}

希望它可以提供帮助。谢谢。

更新:忘了提到 MVC 过滤器仅在路由匹配后执行。因此,您不需要过滤掉静态资源,因为它已经由 MVC 完成。

于 2011-07-26T07:02:16.303 回答
1

我尝试从不同的角度接近它,并且对结果更满意。基本上 - 当您根本无法“路由”静态资源请求时,为什么还要检测它们?在 global.asax 中:

private readonly string[] STATIC_CONTENT_PATHS = new string[] { "css", "js", "img" }; 

public static void RegisterRoutes(RouteCollection routes)
{    
    foreach (string path in STATIC_CONTENT_PATHS) { routes.IgnoreRoute(path + @"/{*foo}"); }

    // other MapRoute calls here
}

现在我不再需要检查静态请求,尽管如果我出于某种原因确实想要检查,我仍然可以执行以下操作:

protected void Application_BeginRequest()
{            
    if (IsStaticRequest())
    {
         // do something here
    }
}

private bool IsStaticRequest()
{
   var result = Request.Url.AbsolutePath.Split('/');
   if (result.Length < 2) return false;
   return STATIC_CONTENT_PATHS.Contains(result[1]);
}

因为我绝对知道我将提供静态内容的唯一路径是什么,所以这似乎是一个相当强大的解决方案。我仍然对其他想法持开放态度,但我认为这很适合我的需求。

于 2011-07-26T05:25:25.923 回答