ASP.NET 以前访问过页面?

ASP.NET Page already visited ever before?

ASP.NET中是否有一种机制可以检测页面是否曾经被访问过? (不存储到数据库或应用程序对象) 我是 运行 IIS 上的站点。

localhost/page?a=1&b=2 - not visited
localhost/page?a=1&b=3 - not visited
localhost/page?a=1&b=2 - already visited!

P.S。检测应该是是否有人访问过它。假设在查询字符串中生成了一些哈希:

localhost/page?a=83abd83de6514ba0a0e5ce620eb1d43e

我需要检查该哈希值是否已被“使用”。

怎么样?对我来说,最简单的方法(不存储到数据库中)是找出是否打开过带有此查询字符串的页面。

实现此目的的几种方法:

  1. 如果你的IIS启用了访问日志,你可以分析它的访问日志
  2. 如果你在IIS之前有一个服务网关,你可以分析它的访问日志
  3. 如果你在IIS之前有一个nginx,你可以分析它的访问日志
  4. 如果你在IIS之前有一个F5,你可以分析它的访问日志
  5. 如果你的应用在云端,你可以分析它的访问日志
  6. 如果这些日志没有足够的信息,你最好实现自己的日志class
  7. 你也可以尝试在redis中记录这些url(K-V,或hyper-log-log,或bloom-filter,取决于你想做什么)

是的,您可以在“~/App_Data/”中创建文件,然后检查文件是否存在。

您的代码如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    var message = "not visited";

    var chk = Guid.TryParse(Page.Request.QueryString["a"], out var guid);

    var hash = chk ? guid.ToString("N").ToUpper() :
        BitConverter.ToString(MD5.Create()
            .ComputeHash(Encoding.UTF8.GetBytes(Request.RawUrl)))
            .Replace("-", string.Empty);

    var path = HttpContext.Current.Server.MapPath("~/App_Data/" + hash);

    if (File.Exists(path))
        message = "already visited!";
    else if (!chk)
        File.WriteAllText(path, string.Empty);

    Label1.Text = message;
}

PS 对于网站中的任何页面,在 Global.asax

中的 Application_BeginRequest 事件中放入类似代码