Lớp học bình dân - Học online

Thống kê lượt truy cập

Đếm số lượt truy cập vào trang web trong Asp.net Mvc Core

Date: 07/02/2025 08:49 Author: Trinh Van Thanh Views: 12

Việc đếm số lượt truy cập vào trang web bằng ASP.NET MVC Core có thể được thực hiện bằng nhiều cách khác nhau. 

I. Thống kê số lượt tuy cập vào website

Dưới đây là một cách đơn giản để đếm số lượt truy cập và lưu trữ kết quả trong bộ nhớ của ứng dụng:

1. Tạo một lớp để lưu trữ số lượt truy cập

public class VisitCounter
{
    private static int _visitCount = 0;

    public static int GetVisitCount()
    {
        return _visitCount;
    }

    public static void IncrementVisitCount()
    {
        _visitCount++;
    }
}

2. Thêm middleware để tăng số lượt truy cập

Trong file Startup.cs, thêm middleware để tăng số lượt truy cập mỗi khi có yêu cầu tới server:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        VisitCounter.IncrementVisitCount();
        await next.Invoke();
    });

    // Cấu hình middleware mặc định của ASP.NET Core
    app.UseMvcWithDefaultRoute();
}

3. Hiển thị số lượt truy cập trên trang web

Trong controller của bạn, bạn có thể lấy số lượt truy cập và truyền nó đến view:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewBag.VisitCount = VisitCounter.GetVisitCount();
        return View();
    }
}

Trong view, bạn có thể hiển thị số lượt truy cập:

<p>Số lượt truy cập: @ViewBag.VisitCount</p>

4. Chạy ứng dụng

Bây giờ, mỗi khi trang web của bạn nhận được một yêu cầu, số lượt truy cập sẽ tăng lên và bạn có thể thấy nó trên trang web.

II. Thống kê số lượt truy cập theo ngày, tháng, năm, hôm trước, tuần trước, tháng trước và số khách đang truy cập

Để thống kê số lượt truy cập theo các khoảng thời gian khác nhau và số khách đang truy cập, chúng ta sẽ cần sử dụng cơ sở dữ liệu để lưu trữ thông tin về lượt truy cập và thực hiện các truy vấn để lấy số liệu. Dưới đây là hướng dẫn cơ bản về cách thực hiện điều này bằng ASP.NET Core và Entity Framework.

1. Tạo mô hình VisitLog để lưu trữ thông tin về lượt truy cập

public class VisitLog
{
    public int Id { get; set; }
    public DateTime VisitTime { get; set; }
    public string VisitorId { get; set; } // Để theo dõi số khách đang truy cập
}

2. Thêm VisitLog vào DbContext

public class ApplicationDbContext : DbContext
{
    public DbSet<VisitLog> VisitLogs { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

3. Cập nhật middleware để lưu trữ thông tin lượt truy cập

Trong file Startup.cs, thêm middleware để lưu trữ thông tin lượt truy cập vào cơ sở dữ liệu:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext context)
{
    app.Use(async (context, next) =>
    {
        var visitLog = new VisitLog
        {
            VisitTime = DateTime.UtcNow,
            VisitorId = context.Connection.RemoteIpAddress.ToString() // Hoặc cách khác để lấy ID của khách truy cập
        };

        context.VisitLogs.Add(visitLog);
        await context.SaveChangesAsync();

        await next.Invoke();
    });

    // Cấu hình middleware mặc định của ASP.NET Core
    app.UseMvcWithDefaultRoute();
}

4. Tạo controller để lấy số liệu thống kê

public class StatisticsController : Controller
{
    private readonly ApplicationDbContext _context;

    public StatisticsController(ApplicationDbContext context)
    {
        _context = context;
    }

    public IActionResult GetVisitCounts()
    {
        var now = DateTime.UtcNow;

        var todayCount = _context.VisitLogs.Count(v => v.VisitTime.Date == now.Date);
        var monthCount = _context.VisitLogs.Count(v => v.VisitTime.Month == now.Month && v.VisitTime.Year == now.Year);
        var yearCount = _context.VisitLogs.Count(v => v.VisitTime.Year == now.Year);
        var yesterdayCount = _context.VisitLogs.Count(v => v.VisitTime.Date == now.Date.AddDays(-1));
        var lastWeekCount = _context.VisitLogs.Count(v => v.VisitTime >= now.AddDays(-7) && v.VisitTime < now);
        var lastMonthCount = _context.VisitLogs.Count(v => v.VisitTime.Month == now.Month - 1 && v.VisitTime.Year == now.Year);
        var currentVisitors = _context.VisitLogs.Count(v => (now - v.VisitTime).TotalMinutes < 10); // Ví dụ: khách đang truy cập trong 10 phút qua

        var stats = new
        {
            TodayCount = todayCount,
            MonthCount = monthCount,
            YearCount = yearCount,
            YesterdayCount = yesterdayCount,
            LastWeekCount = lastWeekCount,
            LastMonthCount = lastMonthCount,
            CurrentVisitors = currentVisitors
        };

        return Json(stats);
    }
}

5. Triển khai và kiểm tra

Sau khi thêm code trên, bạn cần cập nhật cơ sở dữ liệu và triển khai ứng dụng để kiểm tra các số liệu thống kê.

Đối với cách làm trên, nếu 1 IP truy cập nhiều lần thì sẽ làm tăng số lượng truy cập trùng lặp, đặc biệt là khi một IP truy cập nhiều lần trong một khoảng thời gian ngắn. Để tránh điều này, chúng ta có thể sử dụng một số phương pháp sau:

  1. Sử dụng cookie hoặc session:
    • Lưu trữ một giá trị cookie hoặc session để kiểm tra xem người dùng đã truy cập trang web trước đó chưa. Nếu đã truy cập, không tăng số lượt truy cập.
  2. Lưu trữ thông tin truy cập theo IP và thời gian:
    • Lưu trữ thông tin về IP và thời gian truy cập gần nhất. Nếu IP đó truy cập lại trong một khoảng thời gian ngắn (ví dụ: 1 giờ), không tăng số lượt truy cập.

Dưới đây là cách kết hợp cả hai phương pháp trong ASP.NET Core:

  1. Thêm session vào Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(30);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });
        services.AddMvc();
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSession();
    
        app.Use(async (context, next) =>
        {
            var sessionKey = "VisitRecorded";
            var visitorIp = context.Connection.RemoteIpAddress.ToString();
            var currentTime = DateTime.UtcNow;
    
            if (!context.Session.TryGetValue(sessionKey, out _))
            {
                // Kiểm tra nếu IP đã truy cập trong vòng 1 giờ qua
                var lastVisit = await _context.VisitLogs
                    .Where(v => v.VisitorId == visitorIp)
                    .OrderByDescending(v => v.VisitTime)
                    .FirstOrDefaultAsync();
    
                if (lastVisit == null || (currentTime - lastVisit.VisitTime).TotalHours >= 1)
                {
                    // Lưu lượt truy cập mới
                    var visitLog = new VisitLog
                    {
                        VisitTime = currentTime,
                        VisitorId = visitorIp
                    };
    
                    _context.VisitLogs.Add(visitLog);
                    await _context.SaveChangesAsync();
    
                    // Đánh dấu phiên đã ghi nhận
                    context.Session.SetString(sessionKey, "true");
                }
            }
            await next.Invoke();
        });
    
        app.UseMvcWithDefaultRoute();
    }

    2. Lưu thông tin lượt truy cập theo IP và thời gian:

    public class VisitLog
    {
        public int Id { get; set; }
        public DateTime VisitTime { get; set; }
        public string VisitorId { get; set; }
    }

    Bằng cách sử dụng cookie hoặc session và kiểm tra IP, bạn có thể tránh tình trạng tăng số lượt truy cập ảo do một người dùng nhấn vào trang web nhiều lần trong khoảng thời gian ngắn.