【问题标题】:Earliest opportunity to catch a page view捕捉页面视图的最早机会
【发布时间】:2014-03-25 12:38:51
【问题描述】:

我希望尽早在每次页面浏览时调用一个函数。该代码获取用户 IP 地址,并将数据库中的计数器加 1。

此代码是基本的洪水限制器。如果在间隔i 内发出超过x 的请求,则它会暂时禁止该IP 地址。这就是为什么需要尽早在每一页上进行检查的原因。

调用 MasterPages Page_Init

这似乎工作正常,但有时计数器的增量超过 1(我假设是否有 URL 重写或重定向)。

在 Session_Start 上调用 Global.asax

似乎在每个页面视图的计数器中添加了~30

什么是尽早捕获页面视图的最佳方法,最好不需要更改网站上的每个页面?

【问题讨论】:

    标签: c# asp.net pageviews flooding


    【解决方案1】:

    在 Global.asax 中,您可以连接到 HttpApplication.BeginRequest,即:

    ASP.NET 时执行的 HTTP 管道链中的第一个事件 响应请求

    这将针对每个请求(图像、css、javascript 等)触发。如果您只想过滤页面,您可以编写一个 HttpModule,它只会根据请求扩展增加您的计数器。

    【讨论】:

    • 如果我将它添加到我的 global.asax 文件中,一个页面视图似乎会触发此事件约 30-50 次。
    • 这是因为每个页面都有大量的资源,比如图片、javascript、css文件等
    【解决方案2】:

    Page_Initthe earliest event you can subscribe to in WebForms,所以这是要走的路。

    有时计数器的增量会超过 1(我假设是否存在 URL 重写或重定向)。

    这是怎么回事?重定向之后是另一个请求,因此它另一个请求。如果您想排除这些,您必须检查最新事件(在 WebForms 的情况下为Page_Unload)响应是否会执行重定向,如果是,则从计数器中减去一个,如果这是所需的结果.

    如果您不想重新发明轮子,也可以查看Best way to implement request throttling in ASP.NET MVC?

    根据@mathieu 的回答,您可以将Page_InitHttpApplication.BeginRequestPage_UnloadHttpApplication.EndRequest 交换并执行相同的逻辑,使其独立于WebForms。您可以在 Global.asax 中连接这些事件。

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多