我希望尽可能早地在每个页面视图上调用一个函数。代码获取用户IP地址,在数据库中将计数器增加1。
此代码是基本的泛滥限制器。如果在区间x
中发出的请求超过i
,则它会临时禁止该IP地址。这就是为什么检查需要尽可能早地在每一页上进行。
在MasterPages中调用Page_Init
这似乎工作正常,但有时计数器增加超过1(我假设有一个URL重写或重定向)。
在Session_Start上调用Global.asax
似乎在每个页面视图上向计数器添加~30
。
尽可能早地抓住网页浏览量的最佳方式是什么,最好不需要更改网站上的每一页?
答案 0 :(得分:2)
在Global.asax中,您可以挂钩HttpApplication.BeginRequest,即:
ASP.NET时执行HTTP管道链中的第一个事件 回应请求
这将针对每个请求触发(对于图像,css,javascript等)。如果你只想在页面上过滤,你可以编写一个HttpModule,只根据请求扩展名增加你的计数器。
答案 1 :(得分:1)
Page_Init
是the earliest event you can subscribe to in WebForms,所以这是要走的路。
有时计数器会增加1以上(我假设网址是重写或重定向的。)
这是怎么回事?重定向后跟另一个请求,因此 另一个请求。如果要排除这些,您必须检查最新事件(在WebForms的情况下为Page_Unload
)响应是否执行重定向,如果是,则从计数器中减去一个,如果是是期望的结果。
如果您不想重新发明轮子,请参阅Best way to implement request throttling in ASP.NET MVC?。
根据@ mathieu的回答,您可以将Page_Init
与HttpApplication.BeginRequest
和Page_Unload
与HttpApplication.EndRequest
交换并执行相同的逻辑,使其独立于WebForms的。您可以在Global.asax中连接这些事件。