Cấp bậc tác giả:

DOTNET

Thủ thuật tăng hiệu suất trong ASP.NET với điều kiện GET

Được viết bởi QuangIT ngày 08/08/2013 lúc 01:31 AM
Đây không phải là một kỹ thuật rất tốt, nhưng đối với các trang web có nhiều người trở lại nó có thể có tác động rất lớn đến hiệu suất.
  • 0
  • 7157

Thủ thuật tăng hiệu suất trong ASP.NET với điều kiện GET

Bài trước Tôi đã Hướng dẫn cách tối ưu Web ASP.NET trong web.config. Bài này tôi sẽ hướng dẫn cách tăng hiệu suất trong ASP.NET với điều kiện GET. Đây không phải là một kỹ thuật tốt, nhưng đối với các trang web có nhiều người trở lại nó có thể có tác động rất lớn đến hiệu suất.

Làm thế nào nó hoạt động

Hãy bắt đầu bằng cách nhìn vào ví dụ kịch bản sau.

Bạn đang phục vụ một nguồn cấp dữ liệu RSS từ trang web của bạn. Mặc dù nội dung trong các nguồn cấp dữ liệu RSS được cập nhật chỉ hai lần một tuần, người đọc RSS được yêu cầu feed một lần mỗi giờ để kiểm tra các bản cập nhật. Những gì có điều kiện GET không có gì để cho chúng ta một phương pháp để nói với người đọc RSS rằng không có gì thay đổi và do đó chúng ta sẽ không chuyển nguồn cấp dữ liệu một lần nữa trước khi một bản cập nhật xảy ra. Tất cả các trình duyệt và RSS readers và hỗ trợ các khái niệm về điều kiện GET.

Kịch bản cũng áp dụng cho các trang web, blog mà không thay đổi giữa mỗi lần đến thăm.

Có hai cách để sử dụng điều kiện GET:

1. ETag HTTP
2. Tiêu đề Last Modified HTTP

Các ETag HTTP

Từ Wikipedia :

Một ETag (thẻ thực thể) là một response  tiêu đề HTTP trả về bởi một máy chủ web HTTP/1.1 phù hợp sử dụng để xác định sự thay đổi trong nội dung ở một URL được cung cấp. Khi response  HTTP mới chứa các ETag giống như response  HTTP cũ, các nội dung được coi là tương tự mà không có thêm tải. Header là hữu ích cho các thiết bị trung gian để thực hiện các bộ nhớ đệm, cũng như cho các trình duyệt web của khách mà kết quả bộ nhớ cache. Một phương pháp tạo ra các ETag được dựa trên thời gian sửa đổi cuối cùng của tập tin và kích thước của các tập tin, một là sử dụng check.

Nếu ETag được tạo ra không chính xác, nó có thể dẫn đến các file cập nhật không được redownloaded bởi các người dùng, hoặc các tập tin đã có trong bộ nhớ cache được tải xuống một lần nữa.

Khi xác định tiêu đề etag trong response , trình duyệt sẽ lưu trữ ETag đó trong bộ nhớ cache nội bộ của mình. Lần tới nó truy cập vào trang giống như nó sẽ gửi một HTTP header được gọi là If-None-Match đến máy chủ web. Tiêu đề có chứa các ETag từ lần truy cập trước đó. Bằng cách đọc các tiêu đề request If-None-Matchsau đó chúng ta có thể xác định nếu trình duyệt đã có phiên bản mới nhất của trang. Nếu có, thì chúng ta có thể xóa các nội dung bằng cách sử dụng Response.Clear() hoặc Response.SurpressContent = true và thêm một trạng thái 304 để response. Sau đó, chúng ta chỉ gửi tiêu đề lại cho trình duyệt nói cho nó sử dụng trang trong bộ nhớ cache nội bộ của mình. Như vậy vừa an toàn mà rất nhiều băng thông và trang web tăng tốc kể từ khi nó được nạp từ bộ nhớ cache của trình duyệt.

Bạn có thể tạo ra chuỗi ETag từ ngày hoặc GetHashCode() của đối tượng nào. Vì nó là duy nhất cho các phiên bản của trang. Không có quy tắc của định dạng ETag, miễn là nó là chuỗi và nó không chứa ký tự trích dẫn trong ETag.

Sử dụng điều kiện GET sử dụng tiêu đề ETag, bạn có thể sử dụng các phương thức sau đây:

public static void SetConditionalGetHeaders(string etag, HttpContext context)
{
  string ifNoneMatch = context.Request.Headers["If-None-Match"];
  etag = "\"" + etag + "\"";
 
  if (ifNoneMatch != null && ifNoneMatch.Contains(","))
  {
    ifNoneMatch = ifNoneMatch.Substring(0, ifNoneMatch.IndexOf(",", StringComparison.Ordinal));
  }
 
  context.Response.AppendHeader("Etag", etag);
  context.Response.Cache.VaryByHeaders["If-None-Match"] = true;
 
  if (etag == ifNoneMatch)
  {
    context.Response.ClearContent();
    context.Response.StatusCode = (int)HttpStatusCode.NotModified;
    context.Response.SuppressContent = true;
  }
}

Tiêu đề Last Modified HTTP

Tiêu đề Last Modified chứa ngày trong khoảng thời gian qua trang được cập nhật. Bạn có thể thiết lập nó bằng cách gọi Response.Cache.SetLastModified (Ngày giờ). Cũng giống như tiêu đề ETag, điều này sẽ làm cho trình duyệt lưu ngày sửa đổi cuối cùng bộ nhớ cache nội bộ của mình. Tiếp theo thời gian trình duyệt yêu cầu cùng một trang nó sẽ gửi một tiêu đề yêu cầu được gọi là If-Modified-Since, trong đó có các ngày từ tiêu đề Last Modified từ lần truy cập trước của nó. Bằng cách so sánh hai ngày chúng ta có thể xác định có hay không để gửi response đầy đủ hoặc không có gì nhưng mã trạng thái trống rỗng 304.

public static void SetConditionalGetHeaders(DateTime lastModified, HttpContext context)
{
  HttpResponse response = context.Response;
  HttpRequest request = context.Request;
  lastModified = new DateTime(lastModified.Year, lastModified.Month, lastModified.Day, lastModified.Hour, lastModified.Minute, lastModified.Second);
 
  string incomingDate = request.Headers["If-Modified-Since"];
 
  response.Cache.SetLastModified(lastModified);
 
  DateTime testDate = DateTime.MinValue;
 
  if (DateTime.TryParse(incomingDate, out testDate) && testDate == lastModified)
  {
    response.ClearContent();
    response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
    response.SuppressContent = true;
  }
}

Kết luận

Hai phương thức trênbạn có thể gọi chúng từ bất cứ nơi nào trong ứng dụng ASP.NET của bạn. Nó cũng đi kèm với ConditionalGetModule tự động hóa tiến trình này cho mỗi trang trong ứng dụng. Nó nhìn vào response trước khi gửi nó vào trình duyệt và sau đó nó tạo ra ETag bằng cách MD5 toàn bộ response. Nó cũng có vẻ phù hợp với If-None-Match headers gửi bởi trình duyệt, làm cho việc so sánh và sau đó quyết định có hay không để gửi phản hồi đầy đủ.

Hasing MD5 của response trả lời mất ít hơn 1 phần nghìn giây. Nó được dùng cho tất cả các ứng dụng ASP.NET - cả hai MVC và WebForms.

Nguồn bài viết: DOTNET.VN

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML