(ASP.NET) ASP.NET (2009 год)

Счетчики на Web-страничках.

На этой страничке, я расскажу об одной маленькой хитрости - как можно показать на своей страничке всякие полезные счетчики - либо аналогичные Spylog/Liveinternet либо еще более полезные какие-то свои собственные счетчики. Кроме того, получение нормальных отчетов по счетчикам Spylog/Liveinternet платное. Программисту тупо платить даже $50 в месяц за какие-то там отчеты, которые можно и самому выпустить элементарно по своим собственным данным в своей собственной базе.

Основная проблема при показе счетчика, чтобы браузер сам включил в текст странички счетчик прямо на клиенте. Для этого есть множество причин:


Следовательно, счетчики должны включаться непосредственно в HTML-код отрабатыватся именно на стороне клиента - в браузере. Вопрос заключается в том, как это сделать. Для этого существуют три пути:

Теперь я покажу свой код хандлера GetTopicCount.ashx, который формирует картинку с изображением счетчика комментариев. Более сложные картинки, такие как Spylog/Liveinternet/mail.ru/meteonova изготавливаются ровно точно так же, за исключением того, что у них в объекте Drawing.Graphics рисуется что-то еще, а у меня в этом коде рисуется командой G.DrawString лишь одна строка с текстом:


   1:  <%@ WebHandler Language="VB" Class="GetTopicCount" %>
   2:   
   3:  Imports System
   4:  Imports System.Web
   5:   
   6:  Public Class GetTopicCount : Implements IHttpHandler
   7:      Dim ImageHeigth As Integer = 10
   8:      Dim ImageWidth As Integer = 10
   9:      
  10:      Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
  11:          context.Response.ContentType = "image/gif"
  12:          Dim X As New Drawing.Bitmap(ImageWidth + 10, ImageHeigth)
  13:          Dim G As Drawing.Graphics = Drawing.Graphics.FromImage(X)
  14:          'background-color:#FDF5E6;
  15:          G.Clear(System.Drawing.Color.FromArgb(Convert.ToInt32("FD", 16), Convert.ToInt32("F5", 16), Convert.ToInt32("E6", 16)))
  16:          Try
  17:              If context.Current.Request.QueryString("id") IsNot Nothing Then
  18:                  If context.Current.Request.QueryString("id") <> "" Then
  19:                      Dim TopicGuid As Guid
  20:                      TopicGuid = New Guid(context.Current.Request.QueryString("id"))
  21:                      'есть параметр и он ГУИД
  22:                      Dim CN As New System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("SQLServer_ConnectionStrings").ConnectionString)
  23:                      CN.Open() 'здесь иногда валится по таймауту или из-за исчерпания пула подключений (задаются Max Pool Size в коннекшн-стринге)
  24:                      Dim CMD1 As New System.Data.SqlClient.SqlCommand("select count(*) as TOPIC_COUNT from forum with (nolock) where ToTopic = '" & TopicGuid.ToString & "'", CN)
  25:                      Dim TOPIC_COUNT As Integer = CMD1.ExecuteScalar
  26:                      CN.Close()
  27:                      G.DrawString(TOPIC_COUNT.ToString, New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
  28:                  Else
  29:                      G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
  30:                  End If
  31:              Else
  32:                  G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
  33:              End If
  34:          Catch ex As Exception
  35:              G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
  36:          End Try
  37:          X.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif)
  38:      End Sub
  39:   
  40:      Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
  41:          Get
  42:              Return False
  43:          End Get
  44:      End Property
  45:   
  46:  End Class

Вы легко сможете преобразовать этот код для изготвления более сложного информера. В моем коде ID идентифицирует конкретную страничку моего сайта, вы можете им идентифицировать не только страничку, но и клиента.

Точно таким же кодом формируются не только всевозможные счетчики и информеры, но и капчи, которыми удостоверяются кто именно пытается логинится в сайт - робот или человек. Например такие как капчи, которые вы видите user.votpusk.ru, asp-net.ru, terminal.gisis.ru или любые другие.


А вот для того, чтобы программист не чуствовал себя идиотом, который платит не за что - можно отчеты, которые создают счетчики Spylog/Liveinternet/mail/yandex - создавать самому. Для этого всего-навсего необходимо в этом хандлере счетчика добавить две-три строчки, которые положат в базу любой из параметров, которые приносит с собой браузер или определяет драйвер IIS. А потом выпустить любой нужный вам отчет уже по данным в своей базе:




Для просмотра параметров WebRequest'а я создал публичный сервис : http://asp-net.ru/RequestTest.ashx, которым вы тоже можете воспользоваться. С ппмощью этого сервиса интернет-серферы могут посмотреть какие параметры приносит их браузер на любой Web-сервер, а программисты могут отобрать интересущие параметры для сохранения себе в базу для дальнейшего формирования по этим сведениям отчетов. (В принципе таких публичных сервисов у меня создано достаточно много, например здесь Шлюзы к платежным системам интернет-денег я описал технику применения похожего сервиса http://asp-net.ru/PostTest.ashx.)



Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/Counter/index.htm
<На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>