記錄瀏覽者客戶端的信息

来源: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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...