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:
Dưới đây là cách kết hợp cả hai phương pháp trong ASP.NET Core:
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.