0

我有一个功能,我希望尽早在每个页面视图上被调用。该代码获取用户 IP 地址,并将数据库中的计数器加 1。

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

调用 MasterPages Page_Init

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

在 Session_Start 上调用 Global.asax

它似乎添加~30到每个页面视图的计数器。

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

4

2 回答 2

2

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

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

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

于 2014-03-25T12:45:07.930 回答
1

Page_Init您可以在 WebForms 中订阅的最早事件,所以这就是要走的路。

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

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

或者,请参阅在 ASP.NET MVC 中实现请求限制的最佳方式?如果你不想重新发明轮子。

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

于 2014-03-25T12:45:56.613 回答