Thứ Ba, 25 tháng 9, 2012

Sử dụng ELMAH và MiniProfiler với ASP.NET MVC 4

Nếu bạn mới tập làm quen với ASP.NET MVC, bạn có thể chưa biết về ELMAH và MiniProfiler. Đây là hai dự án mã nguồn mở mà bạn có thể cài đặt dễ dàng với NuGet, và cả hai đều nhằm giúp lập trình viên có thể gỡ rối và chuẩn đoán lỗi của ứng dụng. Bài viết này nhằm giới thiệu sơ lược về hai phần mềm này.

ELMAH

<ELMAH là thư viện giúp log (ghi lại) tất cả các lỗi đã xảy ra với ứng dụng. Bạn có thể log và xem tất cả các lỗi mà không cần phải thay đổi bất kỳ dòng code nào. Tất cả bạn cần phải là đó là gọi câu lệnh "install-package" ở ứng dụng Package Manager Console của Visual Studio và ELMAH sẽ được dự án tham chiếu và được cấu hình để hoạt động. Bạn chỉ cần điều hướng đến địa chỉ /elmah.axd trong ứng dụng của bạn, và bạn sẽ thấy tất cả các lỗi (tuy nhiên, bạn chỉ thấy danh sách lỗi nếu đó là các request cục bộ, vì elmah đã được cấu hình mặc định như vậy).

imagetitle


ELMAH giữ tất cả các lỗi trong bộ nhớ, do đó, nếu ứng dụng bị khởi động lại, tập tin log sẽ bị xóa. Nếu bạn mong muốn thông tin log vẫn được lưu lại, bạn có thể cấu hình ELMAH để lưu thông tin log vào một nơi có thời gian sống lâu hơn, ví dụ như trong một database. Bạn có thể cấu hình cho elmah để lưu log lỗi trong database của SQL Compact hoặc SQL Server, hay thậm chí với MongoDB, và hơn thế nữa.

ELMAH và HandleErrorAttribute

Với các dự án ASP.NET MVC, banh nên cài đặt gói elmah.mvc trên NuGet. Khi đó elmah.mvc sẽ tạo ElmahController cho dự nên bạn có thể truy xuất vào địa chỉ /elmah. Quan trọng hơn, elmah.mvc sẽ cài đặt một action filter để log các lỗi cho dù chúng bị đánh dấu là "handled" (đã được quản lý) bởi HandleErrorAttribute. Nếu bạn chỉ cài elmah, các lỗi này sẽ bị bỏ qua, nhưng với elmah.mvc thì tất cả sẽ được log lại.

MiniProfiler

<MiniProfiler là một công cụ giúp tìm các vấn đề về tốc độ thực thi và hiện tượng thắt cổ chai một cách đơn giản và dễ dàng. Để bắt đầu với MiniProfiler, bạn có thể cài đặt gói MiniProfiler.MVC3 trên NuGet (gói này cũng hoạt động được trên ASP.NET MVC 4). Sauk hi cài đặt xong, thêm một dòng mã lệnh ở các template _Layout ngay trước thẻ </body>:

@StackExchange.Profiling.MiniProfiler.RenderIncludes()  

Ngoài ra bạn cần một handler để giúp MiniProfiler có thể lấy về các tập tin script mà nó cần, bạn thêm cấu hình như sau vào tập tin web.config tại thư mục gốc của dự án:

<system.webServer>   ...   <handlers>     <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*"           type="System.Web.Routing.UrlRoutingModule"          resourceType="Unspecified"           preCondition="integratedMode" />   </handlers> </system.webServer> 

Một khi mọi thứ đã sẵn sàng, bạn sẽ thấy kết quả mà MiniProfiler sẽ cung cấp trên góc trên trái của cửa sổ trình duyệt (theo cấu hình mặc định thì thông tin này chỉ xuất hiện ở các request cục bộ). Bạn click vào "time measurement" để xem chi tiết:

imagetitle

Dựa vào MiniProfiler, bạn có thể biết là action mất bao nhiêu thời gian để được thực thi và views mất bao nhiêu thời gian để được tạo ra từ view template, và MiniProfile cũng cung cấp API để nếu bạn cần thông số của một số mã lệnh cụ thế nào đó. Khi MiniProfiler được cài, nó cũng sẽ thêm vào tập tin MiniProfiler.cs trong thư mục App_Start. Tập tin này chứa phần lớn các cấu hình của MiniProfiler, và do đó bạn sẽ dễ dàng cấu hình tùy thuộc vào trạng thái đăng nhập, và lưu thông thin profiling vào database nếu muốn.

Đây là hai dự án đáng để cho bạn quan tâm và sử dụng nếu bạn là lập trình viên ASP.NET.

Tìm hiểu về Cache trong ASP.Net


asp.net caching

Caching là một kĩ thuật phổ biến dùng để tăng sự thực thi bằng cách thường xuyên lưu lại các dữ liệu đã được truy cập hoặc dữ liệu lớn trong bộ nhớ. Trong khuôn khổ các ứng dụng Web thì caching dùng để giữ lại các trang hoặc dữ liệu qua những yêu cầu của HTTP và sử dụng lại chúng mà không cần phải tạo lại lần nữa. ASP.Net có Một số các kiểu caching có thể sử dụng cho các ứng dụng web gồm : output caching, fragment caching, data caching.

 

Outpug caching: Khi dùng Output caching  toàn bộ nội dung của trang sẽ được lưu lại. Với những trang có lượng truy cập lớn, Caching sẽ thường xuyên lưu lại (đến )từng phút một. Khi một trang được lưu lại bằng Output cache, Những yêu cầu gửi tới trang đó sẽ được thực hiện ở trang output mà không cần phải thi hành code hay tạo lại nữa.

 

 Fragment caching: Đôi khi lưu lại toàn bộ trang là không cần thiết, có thể chỉ một phần của trang phải được tạo ra hoặc đáp ứng một yêu cầu nào đó của người sử dụng. Khi đó, Bạn cần  phải xác định những đối tượng và dữ liệu nào cần thiết để tạo dựng và đáng để lưu lại. Mỗi khi nhận ra các phần tử đó thì chúng có thể được tạo ra một lần và sẽ được lưu lại trong một khoảng thời gian nào đó. Ngoài ra, Fragment caching còn có thể được sử dụng để lưu lại một phần của trang output.

 

Data caching:    Bạn làm thế nào để lựa chọn thời điểm lưu lại một phần từ trên trang? Với một vài phần tử, dữ liệu có thể bị thay đổi một cách đều đặn hoặc dữ liệu chỉ có giá trị tại một thời điểm hiện tại. Khi đó một "chính sách" với các phần tử được lưu sẽ được đưa ra trước khi chúng mất đi. Code để truy cập tới các phần tử được lưu chỉ đơn giản là kiểm tra xem nó có hay chưa và tạo lại nó nếu cần thiết.

 

Cache của ASP.net cung cấp các tệp và từ khóa tạo sự phụ thuộc, cho phép bạn tạo phần tử cache phụ thuộc vào một file bên ngoài hoặc phụ thuộc vào một phần tử cache khác. Kĩ thuật này có thể được sử dụng để xóa  bỏ các phần tử  nằm trong những dữ liệu thay đổi.

 

Ở phần 1 của bài viết tôi sẽ giới thiệu với các bạn về Output cache và Fragment cache.

 

Output cache

 

 Chúng ta sử dụng output caching cho toàn bộ trang mà không thay đổi thường xuyên.  Output caching sẽ lưu lại  toàn bộ  dữ liệu HTML của trang web. Mỗi lần có một request đến, nó sẽ kiểm tra xem đã có trong cache hay chưa nếu có thì nó sẽ được trả về còn chưa thì nó sẽ được lưu lại trong Output caching. Để sử dụng trước tiên bạn hãy nhớ đặt chỉ thị  @OutputCache ngay đầu trang .aspx.

 

<%@ OutputCache Duration="600″ VaryByParam="None" %>

 

Các tham số:

 

Duration:  chỉ ra khoảng thời gian mà Cache sẽ lưu trữ trang đó, tính bằng giây. Khi hết khoảng thời gian này, cache sẽ hết hiệu quả, và trang sẽ được vẽ lại từ đầu.Trong khai báo trên thì trang sẽ được cache lại sau 10 phút. Tất cả nội dung đều được lưu lại kể cả hàm thời gian <%= now() %>

 

VaryByParam: chỉ ra tham số GET -thông qua QueryString ,tham số POST – thông qua các form nào sẽ được sử dụng để xác định cache được trả về. Nói cách khác, sẽ có nhiều phiên bản của trang web được lưu trữ, và hệ thống trả về phiên bản nào tùy theo giá trị tham số này. Bạn có thể nhận được kết quả cache khác nhau khi thay đổi giá trị của tham số đầu vào.

 

ví dụ :

 /Student.aspx?StudentID=1 sẽ trả ra thông tin sản phẩm StudentID =1. Nếu một request khác dạng /Student.aspx?StudentID=2, thì tất nhiên, sẽ phải trả ra thông tin sản phẩm với StudentID=2. Nếu bạn thiết lập tham số VaryByParam="none", thì engine cache sẽ giả thiết rằng tất cả các trang Student.aspx có kết quả trả ra như nhau, và hai trang trên trả về cũng một kết quả. Để giải quyết vấn đề, chỉ đơn giản chúng ta thiết lập tham số VaryByParam="StudentID", hoặc chỉ ra là cần xét tất cả các tham số: VaryByParam="*".

 

Ngoài ra bạn chỉ dẫn @OutputCache còn có thêm 2 thuộc tính nữa là VaryByHeader và VaryByCustom.

 

VaryByHeader:  thuộc tính này giúp bạn thay đổi cache theo  HTTP headers hiện tại. Nó thực sữ hữu ích khi bạn muốn cache những trang thay đổi về ngôn ngữ và các tác nhân của người dùng.

 

VaryByCustom.:  có thể quyết định output cache phụ thuộc vào các thiết lập khác nhau như là phiên bản của các trình duyệt.

 

Nếu bạn muốn dùng full page caching nhưng có một số chức năng trên đó bạn không sử dụng được, bạn có thể sử dụng lớp HttpCachePolicy. Bạn chỉ việc làm theo mẫu sau:

 

Response.Cache.[option] : trong đó option là các miêu tả bạn muốn.

 

Ví dụ: Response.Cache.SetExpires( DateTime.Now.AddSeconds( 600 ) )

 

Khi đó cứ sau 10 phút (600s): trang đó sẽ được cache lại một lần giống như ví dụ tôi đã trình bày ở trên.

 

Bạn cũng có thể sử dụng thuộc tính "cacheability" để xác định cách thức lưu trang. Bạn có các lựa chọn sau: 

 

NoCache: Toàn bộ trang hoặc một vài phần của  trang sẽ không được cache mà  phải có yêu cầu.

 

Server: Trang được cache ở Web Server

 

Public: Trang được cached ở máy client và được public, như là một proxy server          

 

Private: Trang chỉ được cache ở trên máy client. Thuộc tính này là mặc định

 

Fragment Caching

 

Có những lúc chúng ta không cache toàn bộ trang, mà chỉ là một phần của trang thôi. Chẳng hạn, danh sách đơn hàng trong công ty là biến đổi theo thời gian, nhưng danh mục hàng có thể là không đổi. Lúc này, chúng ta chỉ cache một phần của trang. Rất đơn giản, bạn cần phải sử dụng phương pháp cache một phần, hay cache một user control. Đó là fragments caching, xây dựng các user control mới (*.ascx), thiết lập thuộc tính Cache giống như là cách làm đối với một trang bình thường.

 

Một điều lưu ý đó là fragment caching không có các thuộc tính VaryByHeader hoặc VaryByCustom. Nó có các thuộc tính VaryByParam làm việc giống như output caching, ngoài ra chúng ta cũng sử dụng các thuộc tính khác như là VaryByControl. Thuộc tính này cho phép ta thay đổi nhiều thành phần cache cơ bản là giá trị của các server controls chứa trong đó, như là select box hay check boxes.

 

Đây chỉ là những mẫu cơ bản nhất của caching được cung cấp trong ASP. Net. Nó không hoàn toàn phù hợp trong tất cả các trường hợp nhưng khi sử dụng nó bạn sẽ nhận được rất nhiều lợi ích trong việc thực thi một ứng dụng Web.


Phần 2: Data Caching

 

Ở phần trước tôi đã giới thiệu với bạn 2 loại cache trong ASP.Net là Output caching và Fragment caching. Cả 2 phương pháp này đều giúp bạn tăng tốc độ xử lý trên ứng dụng web của mình. Tôi cũng đã trình bày những trường hợp phù hợp nhất để sử dụng 2 loại cache này. Tuy nhiên ASP còn cung cấp một kiểu cache khác rất hữu dụng mà bạn nên sử dụng trong nhiều trường hợp đó là Data cahing. Một cách đơn giản nhất, bạn có thể hiểu data cahing là một kĩ thuật được cung cấp để lưu trữ và truy cập các phần tử trong bộ nhớ. Điều đó có nghĩa là mỗi một đối tượng độc lập (Hầu hết các đối tượng của .NET) sẽ được cache và chia sẻ trong tất cả các Request và Session. Bài này tôi xin giới thiệu với bạn 3 phương thức được dùng trong data caching.


Phương thức Cache:

 

Đây là cách đơn giản nhất để bạn có thể lấy được một đối tượng hay dữ liệu vào cache. Nếu bạn đã quen thuộc với ASP, bạn sẽ thấy điều này rất đơn giản cũng giống như khi bạn sử dụng biến session.

 

Đây là cách bạn lưu dữ liệu vào cache:

 

strVal = "something trivial";

cache("item") = strVal;

 

Trong đó:

item       là tên biến.

strVal    là một giá trị biến bạn sẽ lưu nó vào cache.

 

Để trả lại giá trị cho biến hay lấy lại dữ liệu:

 

newVariable = cache("item");

 

Rất đơn giản để lưu và lấy lại dữ liệu từ cache nhưng bạn hãy luôn nhớ rằng data cache không chỉ làm việc được với các dữ liệu đơn giản kiểu chuỗi như ví dụ trên mà nó có thể làm việc với tất cả các loại dữ liệu ví dụ như kiểu mảng cũng có thể được lưu lại bằng cách này.


Phương thức .Insert & .Add

 

Vì Cache là một collection, nên chúng ta cũng có thể sử dụng hai phương thức là Insert và Add để thêm vào Cache. Cú pháp như sau:

 

strVal = "this is SOOO exciting!" ;

cache.insert("item", strVal);


hoặc


cache.add("item", strVal) ;

 

Cú pháp của 2 phương thức này hoàn toàn giống nhau. Có một điều khác đó là hàm add có thêm một lựa chọn, có thể trả về một đối tượng đã có trong dữ liệu cache. Bạn có thể chọn một trong 2  phương thức này tùy thuộc vào yêu cầu của bạn.

 

Hãy xem lại bạn đã học được những gì từ bài viết này. Đầu tiên bạn được đưa ra 3 loại cache để lựa chọn ( output cache, fragment cache và data cache). Tiếp đến, khi bạn sử dụng data cache bạn được cung cấp thêm những hàm để thi hành. Bạn được chọn lựa giữa hàm insert và hàm add. Cuối cùng tôi sẽ hướng dẫn các bạn làm sao để quy định thời gian kết thúc.

 

Đầu tiên là một ví dụ để thiết lập một thời gian kết thúc. Bạn có thể làm như sau:

 

strVal = "I'm learning so much!"

cache.insert("item", strVal, nothing, datetime.now.addminutes(10), timespan.zero) 'there should be no carriage return here

 

datetime.now.addminutes(10): đối tượng sẽ "chết" sau 10 phút.

 

Timespan:    dùng để thay đổi thời gian kết thúc.

 

Chúng ta hãy xét ví dụ tiếp theo. ví dụ này xét thời gian hủy đối tượng  đến thời điểm sau request cuối cùng của object đó.

 

strVal = "Caching is so much fun!"

cache.insert("item", strVal, nothing, datetime.maxvalue,

timespan.fromseconds(60))

 

Thuộc tính datetime.maxvalue vô hiệu hóa sự kết thúc đối tượng.

 

Có một lựa chọn rất thú vị. Chúng ta có thể làm cho ứng dụng bỏ đi một đối tượng trong cache, phụ thuộc vào sự thay đổi của các đối tượng khác. Khi một đối tượng mà nó phụ thuộc bị xoad đi thì nó cũng không còn được lưu trong cache nữa. Nó có thể là một file, một hoặc là nhiều  đối tượng nào đó được lưu.

 

Hãy đọc ví dụ sau:

 

strVal = "I may or may not have understood these directions…"

cache.insert("item", strVal, New CacheDependency(Server.MapPath("depend.xml")))

 

Cache cũng có những nhược điểm đó là nó làm tốn bộ nhớ. Khi bạn lưu trữ lại quá nhiều cũng dẫn tới những bất cập trong việc quản lý dữ liệu. Micosoft đã tính đến trường hợp này và cung câp cho chúng ta những thuộc tính để thiết lập sự ưu tiên.

 

Các thuộc tính:

    * Not Removable- không bao giờ thu dọn dẹp ở bộ nhớ thấp.

    * High- dọn dẹp nhứng phần tử cuối cùng

    * Normal- mặc định

    * BelowNormal – more likely purged

    * Low – first purged

 

Trước khi đưa ra ví dụ, tôi muốn bạn biết rằng chúng ta có 2 lựa chọn bạn phải có khi thiết lập các thuộc tính của cachel. Đầu tiên là CacheItemPriorityDecay sẽ thiết lập các thuộc tính cho các đối tượng mà được truy cập không thường xuyên. Thứ 2 là CacheItemRemoveCallback  sẽ được thiết lập khi ứng dụng muốn dọn dẹp các phần tử cache. Các thuộc tính là: DependencyChanged, Expired, Removed, or Underused.

 

strVal = "Finally, we're done!"

cache.insert("item", strVal, nothing, datetime.maxvalue, _

 timespan.fromseconds(60), CacheItemPriority.BelowNormal, _

 CacheItemPriorityDecay.Fast, OnRemove)

Pros and Cons of Data Caching

 

Như vậy với những trang quá động (dữ liệu được thay đổi nhiều theo thời gian), Data caching đã cung cấp những cải tiến mềm dẻo và thực thi  cho bạn. Nếu ứng dụng của bạn có một lượng truy cập lớn trên nhiều trang web, bạn có thể lưu nó vào cache sau đó phân phát đến từng trang một đó là ưu điểm lớn nhất. Bạn có thể load chúng vào cache lần đầu tiên được requested và sau đó sẽ phân bổ nó đi từ bộ nhớ. Điều này rất tuyệt cho tập hợp các dữ liệu được lấy từ cơ sở dữ liệu ví dụ như là  một employee list  hay là từ một site có cấu trúc điều hướng mà bạn không muốn cứ phải truy cập đến database ở từng trang một.

ASP.NET MVC framework

Đây là bài dịch từ một số bài blog của tác giả Scott Guthrie về ASP.NET MVC Framework về một công nghệ mới ra đời của
ASP.NET.


Một hạn chế của framework ASP.NET từ trước đến nay là không trợ các lập trình viên sử dụng kiến trúc MVC để triển các ứng dụng, và nhiều người vẫn đang mong chờ sự xuất hiện kiến trúc lâu năm này trong bộ framework.

Tại nghị Alt.NET ở Austin, tôi đã có bài thuyết minh về một framework MVC mới cho ASP.NET nhóm của chúng tôi đang thực hiện. Bạn có thể xem đoạn video về thuyết trình của tôi ở trang nhật ký của Scott Hanselman

http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx

Chúng tôi sẽ phát hành bản preview của framework ASP.NET cho mọi người vào cuối năm nay. Dự kiến chúng tôi sẽ cho ra bản chính thức và được hỗ trợ đầy đủ vào nửa đầu của năm 2009.

Model View Controller (MVC) là gì


MCV là tên phương pháp chia nhỏ một ứng dụng thành ba thành phần để cài đặt, thành phần đóng một vai trò khác nhau và ảnh hưởng lẫn nhau, đó là

models, views, và controllers.

1. Models
trong các ứng dụng dựa trên MVC là những thành phần có

nhiệm vụ lưu trữ thông tin, trạng thái của các đối tượng, thông nó là một lớp được ánh xạ từ một bảng trong CSDL. ví dụ, chúng ta có lớp Product được sử dụng để mô tả dữ liệu bảng Products trong SQL, bao gồm ProductID,
OrderDate

2. Còn đối với Views, nó chính là các thành phần chịu trách nhiệm hiển thị các thông tin lên cho người dùng thông qua giao diện. Thông thường, các thông tin cần hiển thị được lấy từ thành phần Models. Ví dụ, đối tượng Product có một "Edit" view bao gồm các textboxes, các dropdowns và checkboxes để chỉnh sửa các thuộc tính của sản phẩm; có một "Display" view gồm 2 dòng, cột dòng là ProductID, dòng sau là OrderDate… để xem thông tin về sản phẩm.

3. Cuối cùng, Controllers trong các ứng dụng kiểu MVC chịu trách nhiệm xử lý các tác động về mặt giao diện, các thao tác đối với models, và cuối cùng là chọn một view thích hợp để hiển thị ra màn hình. Trong kiến trúc MVC, view chỉ có tác dụng hiển thị giao diện mà thôi, còn điều kiển dòng nhập xuất của người dùng vẫn do Controllers đảm trách.


Một lợi điểm của phương pháp MVC là nó bắt buộc phải tạo ra một sự rành mạch trong liên kết giữa 3 thành phần models, views và controllers trong ứng dụng. Duy trì được mối quan hệ rành mạch rõ ràng này khiến việc kiểm tra ứng dụng trở nên dễ dàng hơn, đồng thời trách nhiệm của từng thành phần được định nghĩa rõ ràng và cả ba đều làm việc ăn ý với nhau.

Pattern MVC
cũng cho phép thực hiện red/green test driven development (TDD) (http://en.wikipedia.org/wiki/Test-driven_development),
cài đặt các unit tests tự động, xác định và kiểm tra lại các yêu cầu
trước khi bắt tay vào viết code.

*** Test-Driven
Development (TDD) is a software development technique consisting of
short iterations where new test cases covering the desired improvement
or new functionality are written first, then the production code
necessary to pass the tests is implemented, and finally the software is
refactored to accommodate changes.

Một vài chi
tiết mà tôi có thể hé lộ vào thời điểm hiện tại, đó là:

- Cho phép sự chia tách rành mạch giữa các thành phần, mỗi
thành phần đều có khả năng được test riêng biệt và mặc định hỗ trợ TDD.
Tất cả các mối liên hệ chính yếu trong MVC đều có giao diện để hiển thị
và đều có thể xây dựng thành các mô hình, và bao gồm interface-based
IHttpRequest/IHttpResponse
. Bạn có thể chạy unit test cho ứng dụng
mà không phải chạy các Controllers trong ASP.NET

process, điều này làm unit test chạy nhanh hơn. Bạn có thể sử dụng unit
testing framework nào cũng được, kể cả NUnit, MBUnit,
MS Test

- Được thiết kế để có thể dễ mở rộng và tiện dụng, tất cả mọi thứ trong MVC framework đều có thể nhanh chóng được thay đổi, tùy chọn hóa. Ví dụ bạn có thể viết một View và sử dụng cho nhiều ứng dụng khác nhau, đây là tính pluggable.

- Bao gồm thành phần ánh xạ URL cho phép bạn xây dựng các ứng dụng thân thiện với bộ máy tìm kiếm và với người dùng. Lấy ví dụ tôi có thể ánh xạ URL /products/edit/4 là một trang cho phép chỉnh sửa thông tin về các sản phẩm, hoặc là /Blogs/scottgu/10-10-2007/SomeTopic/ để xem các thông tin.

- MVC

framework hỗ trợ sử dụng các các tập tin .ASPX, .ASCX.Master như là thành phần View, điều đó có nghĩa là bạn vẫn có thể sử dụng các tính năng của ASP.NET như master pages, <%= %> snippets, server controls, templates,
data-binding, localization… Tuy nhiên nó không sử dụng mô hình post-back từ giao diện gửi đến server nữa, thay vào đó, bạn có thể chủ động đưa những post-back từ giao diện đó đến thẳng lớp Controller.
Tóm lại, không còn viewstate hay là page lifecycle còn tồn tại trong mô hình MVC.- Vẫn tiếp tục hỗ trợ các tính năng ASP.NET như là forms/windows authentication, URL authorization, membership/roles, output and data caching, session/profile state management, health monitoring, configuration system, the provider architecture…

Nếu bạn đang tìm kiếm một phương pháp xây dựng các ứng dụng web theo hướng MVC, tôi nghĩ ASP.NET MVCFramework mới ra này sẽ là một lựa chọn tốt, rất rành mạch và dễ sử dụng. Nó cho phép bạn dễ dàng bảo trì sự phân tách giữa các thành phần trong ứng dụng, đồng thời cũng rất tốt trong công việc testing và TDD.

Tôi sẽ viết nhiều bài hướng dẫn hơn trong những tuần sắp đến để mô tả cách thức làm việc của MVC, để cho bạn có
thể nhận ra những ưu điểm và thuận lợi khi sử dụng công nghệ này.

Một ứng dụng cửa hàng thương mại điện tử đơn giản

Tôi sẽ sử dụng một ứng dụng cửa hàng thương mại điện tử để minh họa cái cách mà ASP.NET MVC Framework làm việc.
Bài viết hôm nay tôi sẽ cài đặt một hệ thống liệt kê và tìm duyệt các sản phẩm có trong cửa hàng.

Cụ thể, chúng đang đang xây dựng hệ thống cho phép người dùng cuối tìm duyệt danh sách các
catalog khi họ đến thăm trang /Products/Categories:


Khi người dùng click vào một đường link catalog như hình ở trên, họ sẽ được chuyển tới trang hiển thị các sản phẩm có trong một danh mục cụ thể, đó là trang /Products/List/CategoryName:


Khi người dùng click vào một sản phẩm, họ được chuyển đến trang mô tả thông tin chi tiết về sản phẩm đó, /Products/Detail/ProductID:


Chúng ta sẽ xây dựng tất cả các tính năng trên bằng cách sử dụng ASP.NET MVC framework. Xin nhắc lại một lần nữa, sự phân biệt rõ ràng giữa các thành phần trong ứng dụng, khả năng unit test và TDD là những điều tạo ra sự khác biệt mà chúng ta đặc biệt nhấn mạnh.

Tạo mới một ứng dụng ASP.NET MVC

Visual Studio Project Templates được đi kèm với MVC Framework, cho phép tạo một ứng dụng web
theo template cho sẵn. Đơn giản, bạn chỉ cần vào File -> New Project và chọn template "ASP.NET MVC Web
Application
" và tạo một web mới.

Mặc định khi sử dụng template này, Visual Studio sẽ tạo một solution mới bao gồm hai projects con. Project đầu tiên là web project nơi mà bạn sẽ cài đặt ứng dụng. Project thứ hai là testing project mà bạn dùng để test project thứ nhất:


Bạn có thể sử dụng bất kỳ unit testing nào, bao gồm NUnit, MBUnit, MSTest, XUnit
trong ASP.NET MVC. Visual Studio 2008 đã cài đặt sẵn testing project hỗ trợ MSTest (trong VS 2005 chỉ có Visual Studio Team System SKU mới có), và testing project này được tự động tạo ra khi bạn sử dụng template MVC project.

Trong tương lai chúng tôi cũng sẽ thêm vào các testing project dành cho NUnit, MBUnit và các testing
framework khác, để cho bạn có thêm nhiều lựu chọn khi tạo một ứng dụng web và có ngay một testing project mà bạn thích để sử dụng.

Hiểu rõ cấu trúc thư mục trong Project

Cấu trúc thư mục mặc định của ứng dụng ASP.NET MVC gồm 3 thư mục chính:

* /Controllers

* /Models
* /Views

Như bạn thấy, chúng tôi khuyến khích việc đưa những class điều khiển vào bên trong thư mục /Controllers, những class thuộc về mô hình dữ liệu vào bên trong thư mục /Models, và những gì liên quan đến giao diện vào thư mục /Views.

Mặc dù ASP.NET MVC framework không bắt buộc bạn phải luôn sử dụng cấu trúc này, nhưng đây là cấu trúc mặc định
khi bạn tạo một project mới và chúng tôi luôn luôn khuyến khích việc sử dụng nó để phân chia ứng dụng. Bạn hãy sử dụng cấu trúc này ngoại trừ trường hợp bạn đề ra một lý do đủ thuyết phục để thay đổi nó.

Ánh xạ các URL vào trong class Controller

Hầu hết các web framework, như ASP, PHP, JSP, ASP.NET WebForms…, đều ánh xạ các URL vào một file template được lưu trên đĩa. Lấy ví dụ URL "/Products.aspx" hay "/Products.php" được chuyển đến file template Products.aspx hay Products.php trên đĩa cứng để xử lý. Khi một ứng dụng web nhận được HTTP Request đến web server, thì web framework sẽ chạy đoạn một code cụ thể tương ứng với nội dung của file template, và đoạn code này đóng vai trò xử lý yêu cầu do phía client gửi đến. Thông thường thì đoạn code này sẽ sinh ra HTML và đáp ứng lại phía
client.

MVC Framework lại hoạt động theo một cách khác hoàn toàn, thay vì ánh xạ các URL vào các file
template lưu trên đĩa, nó sẽ đưa thẳng vào các class. Những class được ánh xạ tới được gọi là "Controllers", và chúng sẽ xử lý request đến, kiểm soát dòng nhập xuất và giao diện đối với người dùng, thực thi các ứng dụng và data logic tương ứng với request. Cuối cùng, chúng sử dụng các thành phần Views để tạo HTML và đáp trả lại
request.


ASP.NET
MVC Framework
có một bộ máy ánh xạ URL thật sự mạnh mẽ. Bộ máy này cung cấp phương pháp rất linh hoạt trong việc ánh xạ URLs sang cho ControllerClasses. Bạn có thể dễ dàng định ra các quy luật, cài đặt đường đi để ASP.NET dựa vào các quy luật đường đi đó, xác định xem phải thực thi Controller nào. ASP.NET còn có khả năng phân tích URL, chuyển các thông số trong URL thành các tham số trong lời gọi hàm của Controller. Tôi sẽ viết kỹ hơn về kỹ thuật định tuyến nâng cao trong những bài blog sắp đến.

Đường đi mặc định từ ASP.NET MVC URL đến Controller Classes

Các projects ASP.NET MVC được định nghĩa sẵn một số quy luật về đường đi để bạn không phải hiệu chỉnh thêm điều gì trong khi bắt đầu làm quen với framework mới. Bạn có thể bắt đầu viết mã và sử dụng phương pháp ánh xạ
URL mặc định được định nghỉa trong file Global.asaxASP.NET Application class. File Global.asax này được tự động
tạo ra từ ASP.NET MVC project template.

Phương pháp mặc định đơn giản làm nhiệm vụ ánh xạ một phần URL từ HTTP Request, lấy ví dụ /Products/,
đến một class có tên theo mẫu UrlPathController, tức là URL /Products/ sẽ được chuyển đến class có tên là ProductsController. Để xây dựng chức năng tìm duyệt sản phẩm trong ứng dụng thương mại điện tử, chúng ta thêm vào class "ProductsController" vào project. Bạn có thể sử dụng menu "Add New Item" để nhanh chóng tạo Controller class từ template:


Class ProductsController được kế thừa từ class cơ sở System.Web.MVC.Controller. Thừa kế từ class cơ sở
này không phải là điều bắt buộc, tuy nhiên sẽ khá tiện lợi bởi nó có nhiều phương thức và chức năng mà ta muốn sử dụng về sau này. Một khi chúng ta đã định nghĩa class ProductsController, ASP.NET MVC framework sẽ sử dụng nó cho tất cả các URL bắt đầu bằng "/Products/". ProductsController cũng sẽ được sử dụng bất kỳ khi nào có yêu cầu đến "/Products/Categories", "/Products/List/Beverages" và "/Products/Detail/3", là ba chức năng mà ta sẽ phải cài đặt trong ứng dụng cửa hàng này.

Trong phần tiếp theo tôi sẽ thêm ShoppingCartController để người dùng có thể quản lí giỏ hàng của họ. Thêm vào đó là AccountController cho phép người dùng tạo tài khoản khách hàng, đăng nhập và đăng xuất khỏi website. Tất nhiên khi đã có hai controller này rồi, thì mặc định các URL bắt đầu bằng /ShoppingCart//Account/ sẽ được tự động chuyển hướng sang controller để xứ lý.




Lưu ý: ASP.NET MVC framework không yêu cầu bạn bắt buộc phải sử dụng cách đặt tên để ánh xạ URL theo mẫu như trên. Lý do duy nhất mà ứng dụng tôi đang thực hiện làm như vậy là do nó sử dụng các luật ánh xạ mặc định được tạo bởi ASP.NET MVC Project template. Nếu bạn muốn thay đổi, bạn có thể chỉnh sửa lại các luật trong class ASP.NET
Application
– file Global.asax.

Theo asp.net

Những điểm mới trong ASP.NET 4.0(Phần II)

Session State compression

Session State trong ASP.NET 4.0 là một cơ chế duy trì dữ liệu phiên cụ thể thông qua các yêu cầu tiếp theo. Trong một số trường hợp bạn có thể lưu trữ dữ liệu Session-State của bạn trong một máy chủ Session-State hoặc Microsoft SQL Server. Tuy nhiên hai tùy chọn này yêu cầu bạn phải lưu trữ dữ liệu trong quá trình hoạt động của các ứng dụng Web. Để gửi dữ liệu lên Session-State Server hoặc Microsoft SQL Server phải, dữ liệu Session-State phải được gửi tuần tự. Điều này dẫn đến việc nếu dung lượng dữ liệu gởi lớn sẽ dẫn đến việc ứng dụng thực thi sẽ bị trễ.

Chúng ta có thể giảm bớt độ trễ này bằng cách nén dự liệu lại. ASP.NET 4.0 giới thiệu một cơ chế mới để nén dữ liệu Session-State của bạn cho cả Session-State Server và SQL Server. Nén có thể được kích hoạt bằng cách thiết lập compressionEnable cho đúng trong file web.config.  Trong Ví dụ này  dữ liệu Session-State sẽ được sử dụng System.IO.Compression.GZipStream để nén.

sessionState  mode="SqlServer"  sqlConnectionString="data source=DB;Initial Catalog=LudmalDB"  allowCustomSqlDatabase="true"  compressionEnabled="true"/>

Với tính năng nén, các nhà phát triển thường có thể làm giảm thời gian cần cho một ứng dụng web đáp lại bằng cách giảm kích thước của dữ liệu Session-State.


Những điểm mới trong ASP.NET 4.0 (Phần I)

Điểm nổi bật trong ASP.NET 4.0 chính là việc cải thiện và tối ưu hóa hiệu xuất của bộ máy tìm kiếm (Search-engine Optimization – SEO). Trong bài viết này mình sẽ giới thiệu những gì mình nghĩ là quan trọng nhất trong bản ASP.NET 4.0.

1.      Output cache extensibility

2.      Session state compression

3.      View state mode for individual control

4.      Page.MetaKeyword and Page.MetaDescription properties

5.      Response.RedirectPermanent method

6.      Routing in ASP.NET

7.      Increase the URL character length

8.      New syntax for Html Encode

9.      Predictable Client IDs

10.  Web.config file refactoring

11.  Auto-Start ASP.NET applications

12.  Improvements on Microsoft Ajax Library

Mình sẽ mô tả chi tiết các tính năng ở phần dưới đây:

Output cache extensibility:

Output caching, hoặc Page-Level Caching ,  lưu trự sự trả lại toàn bộ việc đánh dấu trong một thời gian cụ thể của trang web ASP.NET. Điều này luôn luôn là một trong những tính năng cần thiết cho ASP.NET được sử dụng rộng rãi để tăng hiệu suất ứng dụng. Tuy nhiên đã có một số hạn chế về mức độ khả thi của bộ nhớ đệm, bởi vì lưu trữ nội dung luôn luôn phải được lưu trữ trong bộ nhớ.

Nhưng với ASP.NET 4.0 các lập trình viên có thể mở rộng bộ nhớ đệm của họ bằng cách sử dụng Output-cache providers. Người lập trình có thể tạo " Output-cache providers" và dùng bộ nhớ cache ấy để lưu trữ những nội dung bất kì với các cơ chế bền vững như CSDL, lưu trữ đám mây và các công cụ phân phối bộ nhớ cache.

Để tạo một custom Output cache provider, một class trong System.Web.Caching.OutputCacheProvider  trong ASP.NET 4.0.

Bạn cũng có thể set cho custom Output – cache provider như là cơ chế cache mặc định cho hệ thống của bạn

Hơn nữa người lập trình có thể tự cấu hình cho Output-cache provider được sử dụng. Ví dụ bạn có thể muốn cache lưu những trang thường truy cập vào bộ nhớ để có thể truy cập nhanh hơn và ít các trang web thường  xuyên truy cập  được lưu trữ trên đĩa cứng. Bằng phương pháp ghi đè các  GetOutputCacheProviderName (), bạn có thể cấu hình Output – cache provider  để sử dụng cho các nhu cầu khác nhau. Những bổ sung vào Output-cache cho phép người lập trình có các cơ chế cache mở rộng và hiệu quả hơn để ứng dụng web của họ và do đó cải thiện sự đáp ứng của nó.

Tăng tốc cho ứng dụng ASP.NET MVC với Output Caching

Trong bài hướng dẫn này, bạn sẽ học cách tăng tốc độ ứng dụng ASP.NET MVC bằng cách sử dụng output caching. Bạn sẽ học cách cache kết quả trả về từ controller action do đó nội dung đó sẽ không cần phải tạo lại mỗi khi người dùng gọi đến action đó.

 

Trong bài hướng dẫn này, bạn sẽ học cách tăng tốc độ ứng dụng ASP.NET MVC bằng cách sử dụng output caching. Bạn sẽ học cách cache kết quả trả về từ controller action do đó nội dung đó sẽ không cần phải tạo lại mỗi khi người dùng gọi đến action đó.

Ví dụ như ứng dụng ASP.NET MVC của bạn hiển thị danh sách các dòng dữ liệu lấy từ Database ra một View có tên là Index, mỗi khi người dùng gọi controller action trả về view Index, dữ liệu trên sẽ được trả về từ CSDL bằng cách gọi một câu truy vấn đến CSDL.

Nhưng nếu như bạn sử dụng ouput cache thì bạn sẽ tránh được việc phải thực hiện câu truy vấn CSDL mỗi khi action đó được gọi. View sẽ được lấy lên từ cache (bộ nhớ tạm của ứng dụng) thay vì phải gọi action tạo ra dữ liệu và trả kết quả về. Caching giúp cho bạn tránh phải bắt server thực thi lặp đi lặp lại một hành động.

Hữu hiệu Output Caching

Bạn có thể cho phép output caching bằng cách thêm thuộc tính [OutputCache] cho controller action hoặc cho cả controller. Ở Mã minh họa 1, action có tên là Index sẽ được cache trong mỗi mười giây.

 

Mã minh họa 1 – Controllers\HomeController.cs

 


using System.Web.Mvc;    namespace MvcApplication1.Controllers  {      [HandleError]      public class HomeController : Controller      {          [OutputCache(Duration=10, VaryByParam="none")]          public ActionResult Index()          {              return View();          }        }  }     

 

 

Trong mã minh họa 1, nội dung trả về của action Index() được cache trong 10 giây. Nếu bạn thích, bạn có thể quy định thời gian cache (cache duration) dài hơn. Ví dụ, nếu bạn muốn cache một action trong một ngày, bạn có thể quy định thời lượng cach trong 86400 giây ( 60 giây * 60 phút * 24 giờ).

Tuy nhiên, không có gì đảm bảo nội dung sẽ được cache trong thời lượng bạn quy định. Khi tài nguyên bộ nhớ thấp, nội dung cache sẽ bị xóa tự động.

Controller Home trong mã minh họa 1 trả về view Index trong mã minh họa 2. View này chả có nội dung gì đặc biệt, nó chỉ hiển thị thời gian hiện tại (xem Hình 1).

Mã minh họa 2 – Views\Home\Index.aspx

 


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml" >  <head runat="server">      <title>Index</title>  </head>  <body>      <div>            The current time is: <%= DateTime.Now.ToString("T") %>                  </div>  </body>  </html>     

 

 

Hình 1 – view Index đã bị cache

Nếu như bạn gọi action Index() nhiều lần thì bạn sẽ thấy thời gian hiển trị trên view Index sẽ không thay đổi trong vòng 10 giây bởi vì kết quả này đã bị cache.

Bạn cũng phải lưu ý rằng, view này sẽ bị cache và kết quả sẽ được lấy từ cache để cung cấp cho bất cứ ai thăm ứng dụng của bạn. Điều này có nghĩa rằng, thời gian mà web server phải sử dụng để phục vụ view Index cho người dùng được giảm đi đáng kể.

Đừng dụng chỉ thị <%@ OuputCache %> trong view. Chỉ thị này dành riêng cho ứng dụng Web Forms và không nên được dùng trong ứng dụng ASP.NET MVC.

Các nội dung được cache ở đâu?

Theo mặc định, khi bạn sử dụng thuộc tính [OutputCache], nội dung được cache ở ba nơi: ở web server, bất kỳ proxy server nào và web browser. Bạn có thể quy định nơi nào được cache bằng cách thay đổi thuộc tính Location của [OuputCache].

Bạn có thể quy định các giá trị sau cho thuộc tính Location:

· Any

· Client

· Downstream

· Server

· None

· ServerAndClient

Giá trị mặc định của thuộc tính Location có giá trị là Any. Tuy nhiên, có những tình huống mà bạn chỉ muốn cache ở trình duyệt hoặc ở server mà thôi. Ví dụ, nếu bạn muốn cache thông tin được tùy biến cho người dùng, do đó bạn không nên cache thông tin ở server.

Ví dụ, controller ở mã minh họa 3 có một action GetName() trả về tên người dùng hiện tại. Giả sử có người tên "Minh" là người đầu tiên triệu gọi action này, thì những người dùng sau khi triệu gọi trong vòng 1 phút sẽ được trả về kết quả là "Hi Minh" vì nội dung đã được cache ở server.

Mã minh họa 3 – Controllers\BadUserController.cs

 


using System.Web.Mvc;  using System.Web.UI;    namespace MvcApplication1.Controllers  {      public class BadUserController : Controller      {          [OutputCache(Duration = 3600, VaryByParam = "none")]          public string GetName()          {              return "Hi " + User.Identity.Name;          }      }  }     

 

 

Bạn không nên cache nội dung mang tính cá nhân ở server. Thay vào đó, bạn nên cache chúng ở cache của trình duyệt để tăng tốc độ cho ứng dung. Nếu bạn cache nội dung ở trình duyệt và khi người dùng triệu gọi một action nhiều lần thì nội dung sẽ được trả về từ cache của trình duyệt thay vì được lấy từ server.

Ở mã minh họa 4, action GetName() đã được điều chỉnh để chỉ cache ở trình duyệt, và nhờ vậy, những người dùng khác nhau sẽ nhận được kết quả trả về là chính tên của họ chứ không phải tên của một người nào khác.

Mã minh họa 4 – Controllers\UserController.cs

 


using System.Web.Mvc;  using System.Web.UI;    namespace MvcApplication1.Controllers  {      public class UserController : Controller      {          [OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]          public string GetName()          {              return "Hi " + User.Identity.Name;          }      }  }     

 

 

Lưu ý rằng thuộc tính [OuputCache] ở Mã minh họa 4 có bao gồm thuộc tính NoStore. Thuộc tính NoStore với giá trị true có tác dụng yêu cầu proxy servers và trình duyệt không lưu bản sao của nội dung được cache.

Cache action theo tham số

Trong một số trường hợp, bạn sẽ muốn có các phiên bản cache khác nhau cho cùng một nội dung. Ví như khi bạn tạo một trang dạng master/detail. Trang master hiển thị danh sách các tiêu đề phim, khi bạn click chuột vào tên một phim thì bạn sẽ nhận được nội dung giới thiệu chi tiết về phim đó.

Nếu bạn cache nội dung trang chi tiết, thì chi tiết của phim được hiển thị chung nội dung phim được cache bất kể bạn click vào tên phim nào. Và nội dung phim mà người dùng đầu tiên xem sẽ được cache cho những người xem sau.

Bạn có thể khắc phục lỗi này bằng cách sử dụng thuộc tính VaryByParam của [OutputCache]. Thuộc tính này giúp bạn tạo các phiên bản cache riêng biệt tùy theo giá trị của tham số và người dùng truy vấn một action.

Ví dụ, controller ở Mã minh họa 5 có hai action có tên là Master() và Details(). Action Master() trả về danh sách tên các phim và Details() trả về nội dung chi tiết của mỗi phim.

Mã minh họa 5 – Controllers\MoviesController.cs

 


using System.Linq;  using System.Web.Mvc;  using MvcApplication1.Models;    namespace MvcApplication1.Controllers  {      public class MoviesController : Controller      {          private MovieDataContext _dataContext;            public MoviesController()          {              _dataContext = new MovieDataContext();          }            [OutputCache(Duration=int.MaxValue, VaryByParam="none")]          public ActionResult Master()          {              ViewData.Model = (from m in _dataContext.Movies                                 select m).ToList();              return View();          }            [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]          public ActionResult Details(int id)          {              ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);              return View();          }          }  }     

 

 

Action Master() có đính kèm thuộc tính VaryByParam với giá trị là "none". Khi Master() được gọi, nội dung được cache duy nhất của view Master() sẽ được trả về (xem hình 2).

Hình 2 – /Movies/Master 

Hình 3 – /Movies/Details

Action Details() đính kèm thuộc tính VaryByParam với giá trị là "Id".  Và do đó, khi giá trị của tham số Id được truyền vào action thì sẽ có một phiên bản cache được sinh ra và lưu lại.

Ngoài ra bạn có thể gán các giá trị sau cho thuộc tính VaryByParam:

* = Tạo ra các phiên bản cache khác nhau đối với tham số truyền lên khác nhau

none = Chỉ duy trì phiên bản cache chung cho mọi giá trị tham số

Danh sách các tham số (phân tách bằng dấu ;) = Tạo các phiên bản cache khác nhau tùy theo giá trị của các tham số mà bạn quy định.

Tạo Cache Profile

Nhược điểm của việc quy định các tham số trực tiếp trên thuộc tính [OuputCache] đó là bạn không thể thay đổi nó khi đã biên dịch thành tập tin dll. Và vì vậy Microsoft cho phép quy định các tham số của thuộc tính [OuputCache] tại tận tin cấu hình web.config. Cách này mang lại cho hai lợi ích chính, thứ nhất là cho phép bạn áp dụng một cache profile cho nhiều action khác nhau. Lợi ích thứ hai, quan trọng không kém, cho phép bạn tùy chỉnh các tham số cấu hình mà không cần phải biên dịch lại dự án, mọi thay đối ở tập tin web.config sẽ được xác định tự động và có hiệu lực ngay sau đó.

Ví dụ, mục <caching> trong tập tin web.config ở Mã minh họa 6 định nghĩa một cache profile có tên là Cache1Hour. Mục <caching> được định nghĩa bên trong mục <system.web> của tập tin web.config.

Mã minh họa 6 – Caching section ở web.config

 


<caching>  <outputCacheSettings>      <outputCacheProfiles>          <add name="Cache1Hour" duration="3600" varyByParam="none"/>      </outputCacheProfiles>  </outputCacheSettings>  </caching>     

 

 

Controller trong Mã minh họa 7 minh họa cho bạn cách áp dụng cấu hình Cache1Hour cho action với thuộc tính [OuputCache].

Mã minh họa 7 – Controllers\ProfileController.cs

 


using System;  using System.Web.Mvc;    namespace MvcApplication1.Controllers  {      public class ProfileController : Controller      {          [OutputCache(CacheProfile="Cache1Hour")]          public string Index()          {              return DateTime.Now.ToString("T");          }      }  }     

 

 

Nếu bạn triệu gọi action Index() cho Mã minh họa 7 thì action sẽ được cache trong 1 giờ.

Tổng kết

Ouput caching giúp cho bạn có thể dễ dàng tăng tốc các ứng dụng ASP.NET MVC. Ở bài viết này, bạn được học cách sử dụng thuộc tính [OuputCache] để cache kết quả trả về bởi các action. Bạn cũng đã được học cách điều chỉnh các tham số của thuộc tính [OutputCache] như là Duration và VaryByParam để điều chỉnh cách thức cache nội dung trả về. Và cuối cùng bạn học được cách quy đính cấu hình cache trong tập tin web.config của ứng dụng.


Thứ Tư, 19 tháng 9, 2012

Một trang web tiêu biểu có khoảng 61% lưu lượng truy xuất đến từ các kết quả tìm kiếm, trong đó chỉ riêng Google đã chiếm đến 41%.

Đối với hầu hết công ty, việc đảm bảo có được một thứ hạng cao trong kết quả của công cụ tìm kiếm cho website công ty là nhiệm vụ ưu tiên hàng đầu, và đó cũng chính là lý do tại sao tối ưu website cho công cụ tìm kiếm (SEO - search engine optimization) hiện là lĩnh vực hái ra tiền tỷ.

Không ai có thể biết chính xác những phương thức nào khi kết hợp với nhau sẽ đẩy mạnh được tối đa thứ hạng của một website trên trang kết quả tìm kiếm, tuy nhiên nhiều người đã phát triển vài phương thức tốt cho công việc này dựa trên thực tế và kinh nghiệm. Dưới đây là một số kinh nghiệm và thủ thuật về SEO mà các chuyên gia đề nghị.

Tối ưu từ khóa

SEO sẽ trở nên vô dụng nếu bạn không biết mình đang cố gắng tối ưu những gì. Đối với một số doanh nghiệp, việc chọn ra những từ khóa thích hợp để thể hiện tính chất của ngành nghề kinh doanh là chuyện dễ dàng. Tuy nhiên, để chọn được từ khóa thích hợp và thu hút nhiều khách hàng đến với trang web lại là vấn đề không đơn giản. Ví dụ, nếu một cửa hàng trực tuyến bán nhiều chủng loại sản phẩm thì sẽ dùng từ khóa nào?

Đối với người mới bắt đầu, hãy đặt quyết định của bạn dựa vào những từ khóa mà người dùng tìm kiếm thường sử dụng. Một cách để đánh giá tính phổ biến của từ khóa tìm kiếm là sử dụng một công cụ từ khóa trực tuyến được thiết kế để xem các từ khóa phổ thông nào được tìm kiếm thường nhất. Cả Google Keyword Tool (find.pcworld.com/62305) và SEO Book Keyword Suggestion Tool (find.pcworld.com/62306) có thể giúp bạn nhận được kết quả nhanh và chính xác cho bất kỳ từ khóa nào cần kiểm tra, đồng thời cung cấp những từ khóa có liên quan để bạn không phải mất nhiều thời gian suy nghĩ.

Bạn cần tối ưu các từ khóa để thu hút được lưu lượng truy xuất cao nhất và có liên quan nhiều nhất đến những nội dung mà trang web của bạn cung cấp. Vì thế, trước khi thực hiện bất cứ điều gì, bạn hãy cẩn thận chọn ra vài từ khóa có mức độ sử dụng nhiều để tối ưu chúng.

Thay đổi tiêu đề và URL


Google AdWords cho phép bạn tạo ra các mẫu quảng cáo dạng PPC khác nhau và ghi nhận kết quả (hình trên).

Các chuyên gia cho rằng thẻ tiêu đề có thể được xem là "trung tâm" của những nỗ lực tối ưu công cụ tìm kiếm. Khi lập chỉ mục nội dung, công cụ tìm kiếm sẽ xem các từ có trong các thẻ tiêu đề này – đoạn văn bản xuất hiện trên thanh tiêu đề trình duyệt – như là một thành phần quan trọng nhất của trang web. Do đó, hãy cố gắng tạo tiêu đề từ các từ khóa và làm cho mỗi từ khóa này trở thành "nét riêng" của trang web.

Ngày nay, những công cụ tìm kiếm quan tâm nhiều đến các từ khóa trong địa chỉ URL hơn là những từ khóa trong bản thân từng trang web. Dù hầu hết hệ thống lưu trữ web cho phép dễ dàng sử dụng từ khóa trong địa chỉ URL nhưng vẫn còn nhiều hệ thống (như WordPress) mặc định đơn giản hóa địa chỉ URL sử dụng các con số thay vì từ khóa. Các địa chỉ URL có thể đọc được không chỉ giúp ích cho các công cụ tìm kiếm mà còn giúp cả người dùng.

Biết cách hấp dẫn người dùng

Ví dụ, khi người đọc muốn liên kết đến trang web Filmcritic.com chuyên cung cấp lại các đoạn phim thì một liên kết mang tên "Filmcritic.com" sẽ tạo ra những ảnh hưởng tích cực hơn đến thứ hạng mà trang web của bạn nhận được từ các công cụ tìm kiếm so với một liên kết có tên đại loại như "xem lại các đoạn phim". Tại sao như thế ? Bởi vì các công cụ tìm kiếm sẽ xem xét văn bản "neo" được sử dụng để liên kết đến trang web.

Nếu muốn tăng thứ hạng bằng một từ khóa hay một cụm từ nào đó, bạn cần khuyến khích những website khác sử dụng các từ khóa trong đoạn văn bản "neo" cho các liên kết đến website của bạn, thay vì chỉ là tên website như trước. Để thực hiện điều này được dễ dàng, bạn có thể cung cấp một đoạn mã HTML mà bạn muốn website liên kết sử dụng: người dùng chỉ sẽ chép và dán đoạn mã này vào trang web của họ thay vì phải bỏ thời gian điều chỉnh.

Viết đúng chính tả

Trang web của bạn, đặc biệt là các từ khóa không nên để mắc lỗi chính tả. Từ khóa sai chính tả có thể là rắc rối lớn cho người bán hàng trên các trang rao vặt (như eBay) khi họ không thể đoán ra tại sao không ai quan tâm đến món hàng của mình. Tuy nhiên, đôi khi những từ khóa sai chính tả có thể giúp ích cho bạn. Ví dụ, nhiều người dùng thường nhần lẫn từ "Pavillion" với "Pavilion", do đó một từ khóa sai chính tả có dụng ý hoàn toàn có thể trở thành một từ khóa phụ cho trang web.

Đừng để SEO là hướng đi duy nhất

SEO không phải là đối thủ với khả năng và kinh nghiệm của người dùng. Do đó, những gì là tốt cho người sử dụng cũng sẽ tốt cho các công cụ tìm kiếm, vì thế hãy xây dựng trang web với nội dung, thiết kế và kiến trúc tốt nhất mà bạn có thể – điều này sẽ mang đến cho bạn sự thành công trong việc cải thiện thứ hạng của website trên công cụ tìm kiếm. Hãy bảo đảm công cụ tìm kiếm có thể truy xuất dễ dàng những gì mà bạn xây dựng và khi đó bạn chắc chắn sẽ gặt hái được thành công.

SEO VÀ DỊCH VỤ QUẢNG CÁO TRÊN CÔNG CỤ TIỀM KIẾM

Không thể nghĩ đơn giản rằng việc xây dựng một trang web mới nghĩa là đã hoàn thành xong mọi thứ và chỉ cần ngồi đợi khách ghé xem, bạn còn phải biết cách sử dụng công cụ để tiếp thị hình ảnh cũng như cải thiện thứ hạng trang web của mình trên các công cụ tìm kiếm. Bạn cần quảng bá cho website của mình.

Tối ưu công cụ tìm kiếm (SEO) và quảng cáo có trả phí trên công cụ tìm kiếm, nếu được khai thác đúng, có thể đẩy mạnh công việc kinh doanh trực tuyến của bạn.

Cải thiện thứ hạng tìm kiếm

SEO là phương pháp chỉnh sửa trang web nhằm cải thiện sự xuất hiện của nó trên kết quả của các công cụ tìm kiếm. Nếu trang web của bạn không lọt vào Top 30 của kết quả tìm kiếm, có lẽ khách hàng sẽ khó lòng biết được sự tồn tại của nó.

Để trang web được xếp hạng cao trong công cụ tìm kiếm, bạn phải tìm hiểu về phần mềm robot (còn gọi là spider và crawler) được sử dụng trong các công cụ như Google để tìm kiếm và phân loại trang web.

Thứ nhất, hãy học cách mô tả các sản phẩm và dịch vụ của bạn trên website bằng các từ mà khách hàng thường sử dụng trong câu truy vấn.

Phần mềm robot trên công cụ tìm kiếm có thể xác định từng tiêu đề, đầu đề chính và những điểm nhấn đặc biệt trên trang web. Đừng nên mô tả những đầu đề đại loại như "Chào mừng bạn đến cửa hàng trực tuyến ABC", thay vào đó bạn nên tập trung tìm những ý chính, chẳng hạn như "Túi xách hàng hiệu, xx Nguyễn Trãi, Quận 1, TP.HCM".

Thứ hai, nên liên kết trang web của mình đến các trang web khác càng nhiều càng tốt nhằm tăng cường kết quả xếp hạng trên công cụ tìm kiếm; đồng thời nên liên lạc riêng với các nhà quản trị các website đó để giải thích rõ mục đích muốn đặt liên kết.

Công cụ PageRank trong thanh công cụ trình duyệt Google đánh giá tính thông dụng của một website với điểm từ 0 (thấp nhất) đến 10 (cao nhất). Sự lên hạng của trang web sẽ được thể hiện vào số lượng khách đến thăm và từ khóa nào được sử dụng thường xuyên trong lúc tìm kiếm.

Đối với SEO, bạn phải kiên nhẫn chờ đợi trong khoảng 3 tháng trở lên mới thấy được thành quả. Bạn có thể vào trang www.highrankings.com/forum để tham gia vào mục thảo luận hoặc thu thập thêm thông tin về SEO.

Quảng cáo trên công cụ tìm kiếm

Nếu muốn ngay lập tức tăng thứ hạng trang web trên công cụ tìm kiếm thì bạn nên chọn dịch vụ quảng cáo trên các trang này. Cách này có thể tăng lưu lượng người truy cập trang web của bạn chỉ trong một ngày.

Mô hình quảng cáo theo kiểu cứ nhấn chuột trả tiền (Pay per click – PPC) được xem là phổ biến nhất hiện nay. Đây là dịch vụ mà khi đăng quảng cáo trên một công cụ tìm kiếm nào đó, bạn phải trả tiền cho mỗi lần khách hàng nhấn chuột lên mẫu quảng cáo của mình.

Hitwise, công ty chuyên đánh giá lưu lượng hoạt động của trang web, cho biết các công cụ tìm kiếm hiện phổ biến nhất ở Mỹ là Google (chiếm 66% thị phần), Yahoo (21%) và MSN (5%). Căn cứ số liệu trên, nếu quảng cáo theo hình thức PPC trên dịch vụ Google Adwords sẽ giúp bạn thu hút được số lượng lớn khách viếng thăm trang web của mình. Tuy nhiên, bạn cũng có thể đăng ký dịch vụ PPC trên Yahoo và Microsoft với chi phí thấp hơn.

Một điểm lưu ý khác, nếu bạn chỉ muốn quảng bá trang web gói gọn trong một khu vực nào đó thì không nên vung tiền quảng cáo cho các khu vực còn lại.

Theo PCWorld.com.vn

Gỡ bỏ cảnh báo Reported Attack Site của Google

Bài viết này sẽ hướng dẫn Quý khách cách gỡ bở cảnh báo của Google khi site bị nhiễm virus/trojan, Một ngày đẹp trời truy cập site bằng trình duyệt Firefox/Chrome Quý khách thấy thông báo:

A. Nguyên nhân xuất hiện cảnh báo:

1. Website bị chèn mã độc.

2. Website chứa nội dung ko lành mạnh.

Website bị chèn mã độc thường là loại virus hoạt động như 1 keylogger khi nhiễm vào máy tính của Quý khách nhằm ăn cắp mật khẩu, đặc biệt là các account FTP, DirectAdmin, Email... bằng cách tìm tất cả các file có tên index.php, index.html, default.aspx, default.asp, .htaccess trên PC & theo đường FTP đi lên host chèn vào các file sẵn có trên host.

B. Cách kiểm tra & gỡ bỏ mã độc trên code:

1. Cài đặt chương trình diệt virus và upgrade lên phiên bản mới nhất, scan lại toàn bộ PC.

2. Kiểm tra các file có name index.* , Default.*, .htaccess trên host và gỡ bỏ các đoạn iframe (thường là ở cuối file).

3. Sau khi scan PC, Quý khách cần đổi lại các thông tin đăng nhập DirectAdmin, Ftp, Email.

C. Cách gỡ bỏ cảnh báo của Google:

Sau khi code website sạch mã độc. Để gỡ bỏ bảng cảnh báo của Google, Quý khách thực hiện như sau:

1. Đăng nhập http://www.google.com/webmasters/tools

2. Add domain bị cảnh báo vào Webmaster Tools

3. Làm theo hướng dẫn của Google để xác thực domain đó là của Quý khách.

- Meta Tag: Chèn đoạn mã do Google cung cấp vào file index/default sau đó nhấn Verify.

- HTML File: Quý khách cần tạo file xác thực như yêu cầu sau đó upload lên host (thư mục public_html) và nhấn Verify.

4. Trên phần Dashboard, chọn site Quý khách yêu cầu kiểm tra.

5. Ở cột bên trái chọn mục Health -> Malware -> click vào "Request a review" để gửi yêu cầu xem xét lại, thời gian xem xét thông thường mất 1-2 ngày. Sau khi xem xét nếu Google không phát hiện mã độc ở site của Quý khách thì mặc nhiên cảnh báo sẽ được gỡ bỏ ngay sau đó.

Sau thời gian xem xét nếu phát hiện còn mã độc, Google sẽ báo báo cho Quý khách biết cụ thể liên kết (URL) bị nhiễm và loại mã độc. Quý khách nên thực hiện loại bỏ các mã độc đó ngay lập tức và nhấn "Request a review" lần nữa để Google xem xét lại và gỡ bỏ cảnh báo.

---

* Quý khách cần gỡ bỏ cảnh báo mã độc xin vui lòng liên : DD: 0978 994 252 hoặc yahoo: haitvk3

Tôi sẽ hỗ trợ Quý khách thực hiện gỡ bỏ cảnh báo chỉ với một mức phí nhỏ.

Thứ Ba, 18 tháng 9, 2012

Tìm hiểu khái niệm Generics trong C#

Generics là gì?
Generics là một phần kiểu hệ thống của .NET Framework cho phép bạn định nghĩa một kiểu bỏ đi một số chi tiết không xác định. Thay vì xác định rõ các kiểu của các lớp tham số hay thành viên, bạn có thể cho phép mã lệnh sử dụng kiểu của bạn để chỉ định nó. Điều này cho phép mã lệnh sử dụng của bạn biến đổi thích ứng kiểu của bạn tới chỉ định cần thiết của chính nó.
Phiên bản 2.0 của .NET Framework chứa một số lớp generic khác nhau trong namespace có tên là System.Collections.Generic, bao gồm Dictionary, Queue, SortedDictionary, và SortedList. Các lớp này làm việc tương tự như đối với các phần tương ứng nongeneric của nó trong System.Collections, tuy nhiên chúng mang đến hiệu suất được cải thiện và tính an toàn kiểu.

Tại sao phải sử dụng Generics?
Phiên bản 1.0 và 1.1 của .NET Framework không hỗ trợ generics. Thay vào đó, lập trình viên sử dụng lớp Object với các tham số và thành viên sẽ phải chuyển đổi tới các lớp khác dựa trên lớp Object. Generics mang đến hai tính năng cải tiến đáng kể đối với việc sử dụng lớp Object :
Giảm bớt lỗi vận hành (Reduced run-time errors): Trình biên dịch không thể kiểm tra các lỗi kiểu dữ liệu khi bạn chuyển đổi qua đựa trên lớp Object . Ví dụ, nếu bạn chuyển kiểu một chuỗi tới một lớp đối tượng và sau đó áp dụng việc chuyển đổi Object đó tới kiểu integer, trình biên dịch sẽ không catch lỗi. Thay vào đó, công cụ vận hành sẽ throw một exception (đưa ra một thông báo ngoại lệ). Việc sử dụng generics cho phép trình biên dịch catch loại lỗi này trước khi chương trình của bạn thi hành. Ngoài ra, bạn có thể chỉ định các ràng buộc để giới hạn các lớp sử dụng trong một generic, cho phép trình biên dịch kiểm tra phát hiện một kiểu không phù hợp.
Hiệu suất được cải thiện (Improved performance) Việc chuyển đổi đòi hỏi boxing và unboxing. Việc sử dụng generics không đòi hỏi phải casting hay boxing, nó cải thiện hiệu suất run-time.
Cách tạo một kiểu Generic
Trước tiên, chúng ta khảo sát các lớp sau đây. Lớp Obj và lớp Gen thực thi chính xác cùng các tác vụ như nhau, tuy nhiên Obj sử dụng lớp Object cho phép kiểu bất kỳ được gởi tới, trong khi đó lớp Gen sử dụng generics:

class Obj{public Object t;public Object u;  public Obj(Object _t, Object _u){t = _t;u = _u;}}  class Gen{public T t;public U u;  public Gen(T _t, U _u){t = _t;u = _u;}}


Trong đó T và U là kiểu dữ liệu (String hay int..) được gửi tới.
Như bạn có thể thấy, lớp Obj có hai thành viên kiểu Object. Lớp Gen có hai thành viên kiểu T và U. Mã lệnh sử dụng sẽ kiểm tra kiểu đối với T và U. Với việc phụ thuộc vào cách mã lệnh sử dụng dùng lớp Gen, T và U có thể là một string, một int, một lớp theo yêu cầu, hoặc sự kết hợp bất kỳ của những cái đó.

Có một sự giới hạn đáng kể đối với việc tạo một lớp generic: mã lệnh generic chỉ hợp lệ nếu nó sẽ biên dịch mọi instance của generic có thể được khởi tạo, dù là một Int, một string, hay bất kỳ một class nào khác. Về bản chất, bạn đã giới hạn khả năng của lớp Object cơ sở khi viết mã lệnh generic. Vì thế bạn có thể gọi phương thức ToString hay GetHashCode bên trong lớp của bạn, tuy nhiên bạn không thể sử dụng toán tử + hoặc > . Cũng các giới hạn này không áp dụng cho consuming code bởi vì consuming code đã khai báo một kiểu cho generic.
Cách dùng một Generic Type
Khi bạn dùng một kiểu generic, bạn phải chỉ định các kiểu cho các generic bất kỳ được sử dụng. Xem xét mã lệnh console application sau, nó sử dụng các lớp Gen và Obj :

// C#// Add two strings using the Obj classObj oa = new Obj("Hello, ", "World!");Console.WriteLine((string)oa.t + (string)oa.u);  // Add two strings using the Gen classGen ga = new Gen("Hello, ", "World!");Console.WriteLine(ga.t + ga.u);  // Add a double and an int using the Obj classObj ob = new Obj(10.125, 2005);Console.WriteLine((double)ob.t + (int)ob.u);  // Add a double and an int using the Gen classGen gb = new Gen(10.125, 2005);Console.WriteLine(gb.t + gb.u);

Nếu bạn thi hành mã lệnh trong một console application, các lớp Obj và Gen sinh ra các kết quả chính xác như nhau. Tuy nhiên, mã lệnh sử dụng lớp Gen trên thực tế sẽ làm việc nhanh hơn bởi vì nó không đòi hỏi boxing và unboxing xuất phát từ lớp Object . Ngoài ra, lập trình viên cũng sẽ có nhiều thời gian thoải mái hơn với việc sử dụng lớp Gen. Đầu tiên, lập trình viên sẽ không phải cast thủ công từ lớp Object tới các kiểu tương thích.

Liên kết quảng cáo :