Showing posts with label UserAgent. Show all posts
Showing posts with label UserAgent. Show all posts

Wednesday, June 15, 2011


Hit Counter for Logging Users with ASP.net and SQL Server when you don't have access to Windows Server IIS Log Files from Shared/Free Hosting

T-SQL Table for persistent storage and Stored Procedure to save visitor info


SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Log](
LogID int not null identity(1,1) CONSTRAINT PK_Log PRIMARY KEY ([LogID]) ,
[Created] [datetime] NOT NULL  ,
[Page] [varchar](255) NOT NULL,
[UserAgent] [varchar](255) NULL,
[IP] [varchar](15) NULL,  --IPv4 only
[Referrer] [varchar](max) NULL,
[LangCult] [varchar](5) NULL
) ON [PRIMARY]

GO

ALTER PROCEDURE LogCreate
@Created smalldatetime,
@Page varchar(255) = null ,
@UserAgent varchar(255) = null,
@IP varchar(15) = null,
@Referrer varchar(max) = null,
@LangCult varchar(5) = null
AS
BEGIN
INSERT INTO my_Log
(Created, Page, UserAgent, IP, Referrer, [LangCult])
VALUES
(@Created, @Page, @UserAgent, @IP, @Referrer, @LangCult)

RETURN 0
END
GO


C#  This code is called by other pages using  <img src="http://www.YourSite.com/KeepAlive.aspx" height="0" width="0" />

<%@ import namespace="System.Web"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Page Language="C#" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    public void Page_Load(object sender, EventArgs e)
    {
        // to encrypt a connection string in web.config:  aspnet_regiis -pe "connectionStrings" -app "/MyWebsite" -prov "DataProtectionConfigurationProvider"

        string strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["myConnectionStringfromWebConfig"].ConnectionString;

        if (strConnString != null)
        {
            using (SqlConnection cn = new SqlConnection(strConnString))
            {
                using (SqlCommand cmd = new SqlCommand("LogCreate", cn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@Created", SqlDbType.SmallDateTime).Value = DateTime.Now;
                    cmd.Parameters.Add("@Page", SqlDbType.VarChar).Value = this.Request.Url.AbsolutePath;  //Request.CurrentExecutionFilePath)
                    cmd.Parameters.Add("@UserAgent", SqlDbType.VarChar).Value = this.Request.UserAgent;
                    cmd.Parameters.Add("@IP", SqlDbType.VarChar).Value = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

                    string sReferrer = string.Empty;
                    if (Request.UrlReferrer != null) sReferrer = Request.UrlReferrer.ToString();
                    cmd.Parameters.Add("@Referrer", SqlDbType.VarChar).Value = sReferrer;
                 
                    string sUserLanguage = string.Empty;
                    if (Request.UserLanguages[0] != null) sUserLanguage = Request.UserLanguages[0];
                    cmd.Parameters.Add("@LangCult", SqlDbType.VarChar).Value = sUserLanguage;
                 
                    cn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }

This'll get you started to view the log.  There's no filtering so if your site experiences a DDOS attack, each page hit will be recorded, making your SQL Server MDF file grow rapidly. 

<%@ import namespace="System.Web"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Page Language="C#" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    public void Page_Load(object sender, EventArgs e)
    {
        // to encrypt a connection string in web.config:  aspnet_regiis -pe "connectionStrings" -app "/MyWebsite" -prov "DataProtectionConfigurationProvider"

        string strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["myConnectionStringfromWebConfig"].ConnectionString;

        if (strConnString != null)
        {
            using (SqlConnection cn = new SqlConnection(strConnString))
            {
                using (SqlCommand cmd = new SqlCommand("LogCreate", cn))
                {

                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "SELECT DISTINCT  ISNULL([LangCult],'') AS [LangCult], [IP], [UserAgent], ISNULL([Referrer],'') AS [Referrer] FROM [ezpl8_Log]";
                 
                    // SqlDataReader is fast-forward, read only
                    SqlDataReader myReader = cmd.ExecuteReader();
                    if (myReader.Read())
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("<table style=\"font-size:{0}pt;font-family:arial;\">", "8");
                     
                        do
                        {
                            while (myReader.Read())
                                sb.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td></tr>", myReader.GetString(0), myReader.GetString(1), myReader.GetString(2), myReader.GetString(3));
                        } while (myReader.NextResult());

                        sb.AppendFormat("</table>");
                        Response.Write(sb.ToString()); ;
                    }

                }
            }
        }
    }



Young Roofers

Young Roofers
Men Making

Fly. Be Free.

Fly. Be Free.
Man Ready to Hang ... Glide

Burke

Burke
A Man in the Making - 12 years old

Blackwater

Blackwater
A Man in the Mud