实施访客计数器

时间:2009-03-21 09:45:37

标签: asp.net count popularity visitor

我是一名新手并使用ASP .Net 2.0和C#2005开发一个网站。我想添加一个设施来计算数字。访问我的网站。我已经收集了使用Global.asax添加此功能的基本信息。我通过在system.web部分添加行“”对Web.config进行了修改。

我正在使用桌子来保持访客数量。但我不知道如何完成任务。我的默认Global.asax文件带有不同的部分Application_Start,Application_End,Application_Error,Session_Start和Session_End。我试图在Application_Start部分中提取计数器的当前值并存储在全局变量中。我会在Session_Start中递增计数器并将修改后的值写入Application_End中的表。

我试图使用公共子程序/函数。但是我应该在哪里放置这些子程序?我试图在Global.asax本身添加子程序。但现在我收到错误,因为我无法在Global.asax中添加对Data.SqlClient的引用,我需要引用SqlConnection,SqlCommand,SqlDataReader等来实现这些功能。我是否必须为每个子程序添加类文件?请指导我。

我还希望在我的网站上实现跟踪功能,并存储我的网站访问者的IP地址,浏览器使用,访问日期和时间,屏幕分辨率等。我该怎么办?

等待建议。

Lalit Kumar Barik

4 个答案:

答案 0 :(得分:6)

对于天真的实现,您可以使用自定义HttpModule。对于您的应用程序的每个请求,您需要:

  1. 检查Request.Cookies是否包含跟踪Cookie
  2. 如果跟踪Cookie不存在,则可能是新访问者(或者,他们的Cookie已过期 - 请参阅4.)
  3. 对于新访问者,请记录访问者统计信息,然后更新访问者数量
  4. 将跟踪Cookie添加到发送回访问者的响应中。您希望将此Cookie设置为具有相当长的有效期,因此对于已过期Cookie的返回用户,您不会获得大量“误报”。
  5. 下面是一些框架代码(另存为 StatsCounter.cs ):

    using System;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Transactions;
    
    namespace hitcounter
    {
        public class StatsCounter : IHttpModule
        {
            // This is what we'll call our tracking cookie.
            // Alternatively, you could read this from your Web.config file:
            public const string TrackingCookieName = "__SITE__STATS";
    
            #region IHttpModule Members
    
            public void Dispose()
            { ;}
    
            public void Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(context_BeginRequest);
                context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders);
            }
    
            void context_PreSendRequestHeaders(object sender, EventArgs e)
            {
                HttpApplication app = sender as HttpApplication;
                HttpResponse response = app.Response;
                if (response.Cookies[TrackingCookieName] == null)
                {
                    HttpCookie trackingCookie = new HttpCookie(TrackingCookieName);
                    trackingCookie.Expires = DateTime.Now.AddYears(1);  // make this cookie last a while
                    trackingCookie.HttpOnly = true;
                    trackingCookie.Path = "/";
                    trackingCookie.Values["VisitorCount"] = GetVisitorCount().ToString();
                    trackingCookie.Values["LastVisit"] = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
    
                    response.Cookies.Add(trackingCookie);
                }
            }
    
            private long GetVisitorCount()
            {
                // Lookup visitor count and cache it, for improved performance.
                // Return Count (we're returning 0 here since this is just a stub):
                return 0;
            }
    
            void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication app = sender as HttpApplication;
                HttpRequest request = app.Request;
    
                // Check for tracking cookie:
                if (request.Cookies[TrackingCookieName] != null)
                {
                    // Returning visitor...
                }
                else
                {
                    // New visitor - record stats:
                    string userAgent = request.ServerVariables["HTTP_USER_AGENT"];
                    string ipAddress = request.ServerVariables["HTTP_REMOTE_IP"];
                    string time = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
                    // ...
                    // Log visitor stats to database
    
                    TransactionOptions opts = new TransactionOptions();
                    opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opts))
                    {
                        // Update visitor count.
                        // Invalidate cached visitor count.
                    }
                }
            }
    
            #endregion
        }
    }
    

    通过在Web.config文件中添加以下行来注册此模块:

    <?xml version="1.0"?>
    <configuration>
        ...
        <system.web>
            ...
            <httpModules>
              <add name="StatsCounter" type="<ApplicationAssembly>.StatsCounter" />
            </httpModules>
        </system.web>
    </configuration>
    

    (替换为您的Web应用程序项目的名称,如果您使用的是网站项目,则将其删除。

    希望这足以让你开始尝试。正如其他人已经指出的那样,对于一个实际的网站,你最好不要使用Google(或其他)分析解决方案。

答案 1 :(得分:3)

使用Google Analytics。不要试图重新发明轮子,除非a)轮子没有做你想要的或b)你只是试图找出轮子是如何工作的

答案 2 :(得分:1)

我只能提出Gareth建议使用已经可用的流量分析。如果您不喜欢在网站流量上提供Google数据的想法,您还可以下载日志文件并使用其中一个web server log file analysis tools进行分析。

答案 3 :(得分:1)

Google分析脚本正是您所需要的。因为会话,也会为抓取工具打开。