記錄瀏覽者客戶端的信息

来源:http://www.cnblogs.com/insus/archive/2016/05/24/5522271.html
-Advertisement-
Play Games

今天在ASP.NET MVC項目中,實現一個小功能,就是記錄瀏覽者客戶端的一些信息。比如瀏覽者的IP,訪問了哪些頁面,以及瀏覽器相關的信息。在資料庫中創建一張表[VisitData]: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI ...


今天在ASP.NET MVC項目中,實現一個小功能,就是記錄瀏覽者客戶端的一些信息。比如瀏覽者的IP,訪問了哪些頁面,以及瀏覽器相關的信息。

在資料庫中創建一張表[VisitData]:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[VisitData](
    [VisitData_nbr] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [IP] [varchar](20) NOT NULL,
    [Controller] [varchar](30) NULL,
    [Action] [varchar](30) NULL,
    [Browser] [varchar](30) NULL,
    [Version] [varchar](10) NULL,
    [Platform] [nvarchar](30) NULL,
    [Languages] [nvarchar](30) NULL,
    [UserAgent] [nvarchar](300) NULL,
    [RecordDate] [datetime] NOT NULL DEFAULT (getdate()),
    [CreatedBy] [nvarchar](30) NOT NULL DEFAULT (suser_sname()),
    [UpdatedBy] [nvarchar](30) NOT NULL DEFAULT (suser_sname()),
    [CreateDate] [datetime] NOT NULL DEFAULT (getdate()))

GO
Source Code


既然有資料庫,那我們還需要寫一個存儲過程[dbo].[usp_VisitData_Insert]:

 

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE PROCEDURE [dbo].[usp_VisitData_Insert]
(    
    @IP VARCHAR(20),
    @Controller VARCHAR(30),
    @Action    VARCHAR(30),
    @Browser VARCHAR(30),
    @Version VARCHAR(10),
    @Languages NVARCHAR(30),
    @Platform NVARCHAR(30),
    @UserAgent NVARCHAR(300)
)
AS        
INSERT INTO [dbo].[VisitData]([IP],[Controller],[Action],[Browser],[Version],[Languages],[Platform],[UserAgent]) 
VALUES (@IP,@Controller,@Action,@Browser,@Version,@Languages,@Platform,@UserAgent)


GO
Source Code

 

在資料庫方法,我們就做這些,接下來我們需要轉到ASP.NET MVC項目中,創建一個Model:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Insus.NET.Models
{
    public class VisitData
    {
        public string IP { get; set; }

        public string Controller { get; set; }

        public string Action { get; set; }

        public string Browser { get; set; }

        public string Version { get; set; }

        public string Languages { get; set; }

        public string Platform { get; set; }

        public string UserAgent { get; set; }
    }
}
Source Code


創建完model之後,還需要創建一個Entity,這個實體就是數據與資料庫之相關聯:

 

using Insus.NET.DataBases;
using Insus.NET.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Insus.NET.Entities
{
    public class VisitDataEntity
    {
        BizSP sp = new BizSP();

        public void Insert(VisitData vd)
        {
            List<Parameter> param = new List<Parameter>() {
                                    new Parameter("@IP", SqlDbType.VarChar, -1, vd.IP),
                                    new Parameter("@Controller", SqlDbType.VarChar, -1, vd.Controller),
                                    new Parameter("@Action", SqlDbType.VarChar, -1, vd.Action),
                                    new Parameter("@Browser", SqlDbType.VarChar, -1,vd.Browser ),
                                    new Parameter("@Version", SqlDbType.VarChar, -1,vd.Version ),
                                    new Parameter("@Languages", SqlDbType.VarChar, -1, vd.Languages),
                                    new Parameter("@Platform", SqlDbType.VarChar, -1,vd.Platform ),
                                    new Parameter("@UserAgent", SqlDbType.NVarChar, -1, vd.UserAgent)
            };

            sp.ConnectionString = DB.ConnectionString;
            sp.Parameters = param;
            sp.ProcedureName = "usp_VisitData_Insert";
            sp.Execute();
        }
    }
}
Source Code


下麵,我們考慮,只是瀏覽訪問首頁時,我們就去獲取客戶端的信息:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Insus.NET;
using Insus.NET.Attributes;
using Insus.NET.Models;
using Insus.NET.Utilities;
using Insus.NET.Entities;

namespace Insus.NET.Controllers
{    
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            VisitData vd = new VisitData();
            vd.IP = NetUtility.GetClientIP();
            vd.Controller = this.ControllerContext.RouteData.Values["controller"].ToString();  //"Home"; 
            vd.Action = this.ControllerContext.RouteData.Values["action"].ToString();  //"Index";

            HttpBrowserCapabilities bc = System.Web.HttpContext.Current.Request.Browser;
            vd.Browser = bc.Browser;
            vd.Version = bc.Version;
            vd.Languages = System.Web.HttpContext.Current.Request.UserLanguages[0];
            vd.Platform = bc.Platform;
            vd.UserAgent = System.Web.HttpContext.Current.Request.UserAgent;

            VisitDataEntity vie = new VisitDataEntity();
            vie.Insert(vd);
            return View();
        }
    }
}
Source Code


瀏覽網站首頁,去資料庫查詢記錄的情況:

 

我們需要的數據已經拿到了。

到現在為止,還有一個問題,我們需要記錄瀏覽者訪問了哪一個頁面的記錄,我們需要把上面那段代碼粘貼至所在控制器的操作(Action)中。如果這樣多,另一個問題又來了,一個ASP.NET MVC項目這樣多。那上一個很可的事情,特別是在維護的時候,就知道它的利弊了。

寫一個靜態的Utility吧,然後每一個操作中使用這個方法名即可。嗯,想法不錯。

不過,在ASP.NET MVC中,有一個更好的方法,就是過濾(filter).



using Insus.NET.Entities;
using Insus.NET.Models;
using Insus.NET.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;

namespace Insus.NET.Attributes
{
    public class VisitActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            VisitData vd = new VisitData();
            vd.IP = NetUtility.GetClientIP();
            //vd.Controller = this.ControllerContext.RouteData.Values["controller"].ToString();  //"Home"; 
            //vd.Action = this.ControllerContext.RouteData.Values["action"].ToString();  //"Index";

            vd.Controller = filterContext.RouteData.Values["controller"].ToString();
            vd.Action = filterContext.RouteData.Values["action"].ToString();

            HttpBrowserCapabilities bc = System.Web.HttpContext.Current.Request.Browser;
            vd.Browser = bc.Browser;
            vd.Version = bc.Version;
            vd.Languages = System.Web.HttpContext.Current.Request.UserLanguages[0];
            vd.Platform = bc.Platform;
            vd.UserAgent = System.Web.HttpContext.Current.Request.UserAgent;

            VisitDataEntity vie = new VisitDataEntity();
            vie.Insert(vd);
        }       
    }
}
Source Code


接下來簡單的事情,就是在每一個控制器添加上面這個特性,如:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相關博文: "ASP.NET 5 Target framework dnx451 and dnxcore50" .NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture ...
  • ![圖片來自網路/圖文無關][0] 前言 在C 開發的WinForm窗體程式開發的時候,經常會使用多線程處理一些比較耗時之類的操作。不過會有一個問題:就是涉及到跨線程操作UI元素。 相信才開始接觸的人一定會遇上這個問題。 為瞭解決這個問題,可以通過委托來實現。 我為了後期使用更加方便,就將常用的幾個 ...
  • 擬合 概論 Gap的預測,是建立在一個擬合函數上的。也有一些機器學習的味道。 總的Gap函數 = 函數(時間,地區) TimeID : 時間片編號 DistricID:地區編號 Traffic:交通流量 Weather:天氣 POI:設施數 "百度地圖POI說明" 註意:每家公司的POI分類都是不同 ...
  • dataGridView_htList為一個 DataGridView(ht為HoverTree的縮寫)方法一:dataGridView_htList.Columns["HtAddTime"].HeaderText = "添加時間";其中HtAddTime為列的Name方法二:dataGridVie ...
  • 聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
  • public class MyClass : IDisposable { public int a; public MyClass() { //構造 } public void Dispose() { Dispose(true); ... ...
  • 顯示結果: ID:1 ParentID: 0 TreeLevel: 0 Name:中國ID:2 ParentID: 1 TreeLevel: 1 Name:江西ID:5 ParentID: 2 TreeLevel: 2 Name:南昌ID:6 ParentID: 5 TreeLevel: 3 Nam ...
  • 直接在vs2013里的App_Data目錄創建資料庫,在伺服器資源管理器中查看時報錯: 未能載入包“Microsoft SQL Server Data Tools” 英文: 以下是右擊表的效果。 解決方案: 1.去https://msdn.microsoft.com/zh-cn/dn864412 下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...