抓住页面视图的最早机会

时间:2014-03-25 12:38:52

标签: c# asp.net pageviews flooding

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

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

在MasterPages中调用Page_Init

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

在Session_Start上调用Global.asax

似乎在每个页面视图上向计数器添加~30

尽可能早地抓住网页浏览量的最佳方式是什么,最好不需要更改网站上的每一页?

2 个答案:

答案 0 :(得分:2)

在Global.asax中,您可以挂钩HttpApplication.BeginRequest,即:

  

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

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

答案 1 :(得分:1)

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

  

有时计数器会增加1以上(我假设网址是重写或重定向的。)

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

如果您不想重新发明轮子,请参阅Best way to implement request throttling in ASP.NET MVC?

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