Asp.net 检测同时访问的唯一用户

Asp.net 检测同时访问的唯一用户,asp.net,.net,google-analytics,Asp.net,.net,Google Analytics,想象一个简单的html页面,其中3个iFrame指向同一url: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <iframe src="http://www.mydom.com/mypage.aspx"></iframe> <iframe src="ht

想象一个简单的html页面,其中3个iFrame指向同一url:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
</body>
</html>

他有个问题。使用3个iFrame访问html页面时,我同时三次点击mypage.aspx和Request.Cookies[“myc”]都为空,但我应该知道它是同一个用户(第一次点击:新访问者,第二次和第三次点击:返回访问者,总共一个访问者/用户)。有没有办法解决这个问题?

这很有道理。所有这些请求在第一次没有任何cookie,因此在所有情况下都将为null。请记住,它应该尽可能异步地执行此操作,它必须是线性的(可能是,我不擅长如何处理流)

相反,请查看Ip地址和时间戳。如果是相同的,则可以将其视为同一用户进行工作


是的,这个解决方案并不完美,但它比cookie解决方案要好。

一个非常有趣的问题

核心问题是互联网是一个异步、匿名的地方

浏览器可能一次提交其中一个请求,或者同时提交所有三个请求,因此无法控制用户机器上事件的顺序

此外,浏览器不会做出任何特殊努力来唯一标识用户。必须在请求/响应周期中安装任何识别系统。GA使用cookies标记用户,并可以在每个请求中提取该信息。本质上,GA在用户访问您的站点之前标记用户,从而允许该服务在“第一次”点击时识别用户

您的问题是您想要实现自己的身份识别解决方案。您需要以某种方式在请求中包含用户的身份。但是,在他们访问网站之前,你没有办法做到这一点。而且,考虑到每个同时发出的请求都会在响应中嵌入不同的标识,您无法保证用户将被标记为单个标识

基本上,就我所知,没有一种解决方案可以让匿名用户被你的站点自动唯一地识别

您可能会尝试使用IP地址,这在某些情况下可能会起作用,但这是一个非常糟糕的解决方案。现在我在我的雇主防火墙后面。如果您使用当前可见的IP地址来识别我,您将看到我和作为单个用户在这里工作的其他5000人。这是一个非常危险的系统

如果你真的,真的需要每个用户都有一个单一的身份-一个不能通过多个同时请求规避或意外践踏的身份,etc-那么您唯一的解决方案就是要求用户在第一次请求时通过POST或GET查询中嵌入的值或在前一次访问中创建的cookie明确标识自己

在您的场景中,所有三个响应都可以生成一个具有唯一ID的cookie(连续三个ID,每个ID都覆盖以前的值)。登录页面可以是一个通用的“欢迎访问我的站点”页面,或者类似的页面。然后,用户可以单击链接访问该站点,此时最后生成的cookie(具有最后生成的id)将嵌入请求中。虽然您不能保证每个用户只生成一个ID,但您至少可以相当有信心,在第一轮请求之后(以及在他们访问站点的主要内容部分之前),他们将通过一个ID进行识别

当然,您可以使用一个复杂的AJAX解决方案,其中对未识别用户的响应本质上是一个容器(没有ID)。AJAX然后可以在cookie中设置一个标志,指示它正在检索ID,然后可以提交第一个请求。随后的AJAX容器将看到这个cookie,然后进入轮询状态,等待清除标志。当第一个响应返回时,第一个AJAX容器可以在cookie中设置ID并更改标志。然后,其余容器将检测到标志更改,并可以从cookie中检索ID(而不是发送自己的请求)

一旦AJAX容器有了ID,它就可以发送内容请求和唯一ID。然后,您的站点可以响应,用适当的数据填充容器(或者简单地重定向到适当的页面)


这个解决方案,如果实施得当,或多或少会保证一个用户只分配一个ID。但真的值得吗?记住,cookie和请求“属于”用户。用户可以很容易地编辑两者。虽然有一些技术可以检测编辑的身份(大多数涉及某种形式的加密),但如果用户愿意,您无法阻止他们自己“匿名”。有时,一个折中的解决方案就足够了。

您所要做的就是将相同的代码放入[webMethod]而不是PageLoad中,然后通过js(XMLHttpRequest)从客户端调用[webMethod],您将依次收到这三个调用。由于同时点击,没有更多问题。

不要使用iFrame,使用母版页。创建母版页,并将此代码放在“mypage.aspx”的顶部


使用他们的IP地址肯定能解决这个问题吗?Google Analytics javascript成功地做到了这一点,我不知道如何做到,但如果我在mypage.aspx中插入GA,我就能正确地看到新的和返回的访问者。也许有人能够研究GA js(相当复杂和小型化)。GA使用跟踪cookies(因此欧盟cookie指令中的所有乐趣),所以第一次访问时会在您的机器上放置cookie,并使用它跟踪您的站点。上面的问题会发生在GA中,因为跟踪代码会在页面中出现3次-这是不应该发生的事情!我认为他应该像你一样将cookie移动到父页面,而GAIs位于不同于简单页面的域中?如果是这样,您将无法读取cookie值。“myc”cookie将mydom.com作为域,因此没有问题,我可以读取t
if (Request.Cookies["myc"] == null)
{
    // New visitor!
    Response.Cookies["myc"].Value = myval;
    Response.Cookies["myc"].Expires = DateTime.Now.AddYears(10);
}
else
{
    // Returning visitor
}
<%@ Page Language="C#" MasterPageFile="~/Site1.Master" ...