Useful Tools for ASP.NET Developers


This post lists useful tools for ASP.NET developers.


  1. Visual Studio

    1. Visual Studio Productivity Power tool: Extensions to Visual Studio Professional (and above) with rich features like quick find, solution navigator, searchable add-reference dialog, etc.
    2. ReSharperProductivity tools for .NET developers. improves code quality, eliminates errors by providing quick fixes, etc.
    3. MZ-Tools: It can find strings in a method, file, project, solution or project group, selected text, group of files or group of projects. The results are shown in the following results window, much more convenient than the one provided by the Microsoft IDEs.
    4. Web EssentialsBoosts productivity and helps if efficiently writing CSS, JavaScript, HTML, etc.
    5. MSVSMONThe Remote Debugging Monitor (msvsmon.exe) is a small application that Visual Studio connects to for remote debugging. During remote debugging, Visual Studio runs on one computer (the debugger host) and the Remote Debugging Monitor runs on a remote computer together with the applications that you are debugging.
    6. WIX toolset: Builds Windows installation packages from XML source code.
    7. Code diggerCode Digger is Visual Studio 2012/2013 extension which helps you to understand behavior of your code.
    8. CodeMaidCodeMaid is an open source Visual Studio 2012/2013/2015 extension to cleanup, dig through and simplify your code.
    9. OzCodePowerful Visual Studio debugger visualizer.
    10. CodeRushIt is a refactoring and productivity plug in for Visual Studio.
    11. T4 Text TemplateIn Visual Studio, T4 Text Template is used as template to generate code files. The template can be defined by writing text block and control logic.
    12. Indent GuidesAdds vertical lines at each indent level.
    13. PowerShell Tools: A set of tools for developing and debugging PowerShell scripts and modules in Visual Studio 2015.
    14. Visual Studio Code: Free cross platform editor to build and debug modern web and cloud applications. [Contributed by: Cheung Tat Ming]
    15. AutoPoco: AutoPoco is a highly configurable framework for the purpose of fluently building readable test data from Plain Old CLR Objects.
    16. Supercharger: It is an extension designed to significantly improve the Visual Studio development experience. It builds upon and enhances previous VS10x products like CodeMAP, Editor View Enhancer, Comments Extender while also adding new high-quality tools.
  2. ASP.NET

    1. FiddlerTo capture http request/response as well as simulate request behavior.
    2. AutoMapperObject to object mapping. Like, the tool can be used to map entity objects to domain objects instead of writing manual mapping code.
    3. Unity/Ninject/Castle Windsor/StructureMap/Spring.NetDependency injection framework. There are a lot of DI frameworks available.
    4. .NET Reflector.NET assembly decompiler.
    5. dotPeek.NET assembly decompiler.
    6. ILSpy.NET assembly decompiler.
    7. memprofilerPowerful tool to find memory leak and optimize memory usage.
    8. PostSharpRemoves repetitive coding and prevents code bloating due to cross-cutting concerns with aspect oriented programming.
    9. ASPhere: Web.config editor with GUI.

    1. Swagger UIAPI testing and documentation tool. Video
    2. PostMan: REST client Chrome extension. [Contribute by: Cheung Tat Ming]
  4. WCF

    1. SOAP UIAPI testing tool which supports all standard protocol and technologies.
    2. WireSharkIt is a network protocol analyzer for Unix and Windows. It can capture traffic at TCP level and help you see soap envelop.
    3. Svc TraceViewer: Provides better view of huge trace file which is produced by WCF.
    4. Svc Config Editor: GUI tool for managing WCF related configurations.
  5. MSMQ

    1. QueueExplorer 3.4: Copy, move or delete messages, save and load, stress test, view and edit full message bodies (with special support for .NET serialized objects), and much more for MSMQ.
  6. LINQ

    1. LINQ Pad?: LINQPad is a light weight tool to test linq queries against SQL Server database. It can also test code snippet written in different .NET languages like C#, VB, etc.
    2. LINQ InsightLINQ Insight Express is a Visual Studio add-in that allows you to analyze your LINQ queries at design-time and simplifies writing and debugging LINQ queries.
  7. RegEx

    1. RegEx tester: Extension for Visual Studio for regular expression testing.
    2. regexr: Online RegEx develop and testing tool.
    3. regexpalOnline RegEx develop and testing tool.
    4. Expresso: Expresso is a destop tool for RegEx develop and testing.
    5. RegexMagic : Tools to auto-generate regular expression from text pattern. The user needs to feed the pattern by marking the substrings and selecting different options. Based on that, the regex will be auto-generated. The tools also generate the required code in different language. [Contributed by: Samuel Christison]
  8. Javascript/JQuery/AngularJS

    1. JSHint: JavaScript code quality tool. There is one more tool JSLine which enforces stricter rules.
    2. JSFiddle: It provides an environment inside the browser to test HTML, CSS and Javascript/JQuery.
    3. Protractor: End to end framework to test angular application.
    4. Batarang: Adding tools for debugging and profiling AngularJS applications
  9. SQL Server

    1. SQL ProfilerSQL trace for monitoring instance of database engine.
    2. ExpressProfilerExpressProfiler (aka SqlExpress Profiler) is a simple and fast replacement for SQL Server Profiler with basic GUI and integration. This can be used with both Express and non-Express editions of SQL Server 2005/2008/2008r2/2012/2014. [Contributed by: RickZeeland]
    3. SQL Sentry Plan explorerThe tool provides better graphical view of SQL Query execution plan.
    4. SQL CompleteProvides Intellisense functionality and Improved SQL Formatter in SQL Server Management Studio and Visual Studio.
    5. NimbleTextText manipulation and code generation tool.
    6. Query Express: Light weight SQL Query analyzer like tool.
    7. IO MeterProvides detail of IO subsystem.
    8. sqldecryptorDecrypts SQL Server objects like Stored Procedures, Functions, Triggers, Views which were encrypted WITH ENCRYPTION option.
    9. SpatialViewerTo view and create spatial data.
    10. ClearTrace: Imports trace and profiler files into SQL Server and displays summary performance information.
    11. Internals Viewer for SQL ServerInternals Viewer is a tool for looking into the SQL Server storage engine and seeing how data is physically allocated, organized and stored.
    12. PALReads in a perfmon log and analyzes it using known thresholds.
    13. sqlquerystress: Assists with performance stress testing of T-SQL queries and routines.
  10. NHibernate

    1. NHibernate Mapping GeneratorGenerates NHibernate mapping files and corresponding domain classes from existing DB tables.
  11. Tally

    1. Tally ERP 9
    2. Tally dll: A dynamic link library for .NET to integrate your application with Tally Accounting software to push and pull data progrmmatically.
  12. Code Review

    1. StyleCopStyleCop is a static code analysis tool which enforces set of configured style and consistency rules for your C# source code. It can be run from inside of Visual Studio or integrated into an MSBuild project. 
    2. FxCop?: FxCop is a static code analysis tool which enforces development standards by analyzing .NET assembly.
  13. Traffic Capture

    1. WireShark: It is a network protocol analyzer for Unix and Windows. It can capture traffic at TCP level. 
    2. HTTP Monitor: Enables the developer to view all the HTTP traffic between your computer and the Internet. This includes the request data (such as HTTP headers and form GET and POST data) and the response data (including the HTTP headers and body).
  14. Diagnostic

    1. Glimpse: Provides server side diagnostic data. Like, for an ASP.NET MVC project, you need to add it from NuGet. The Glimpse data can show you latency at different levels and really indicate areas where you can optimize your code/solution to boost performance.
  15. Performance

    1. PerfMon: Monitors system performance using performance counters.
    2. yslowYSlow analyzes web pages and indicates why they’re slow based on Yahoo!’s rules for high performance web sites.
  16. Code Converter

    1. Telerik Code ConverterC# to VB and VB to C# code converter. It is an online editor. But you can choose ‘Batch Converter’ and upload files in zip format.
  17. Data Extraction and Loading

    1. FileHelpers.NET library to import/export data from fixed length or delimited records in files, strings or streams.
    2. LogParser: You can write SQL to queries against a variety of log files and export the data to a variety of destinations like SQL tables, CSV files.
  18. Screen Recording

    1. Wink: Presentation creation software. Using Wink, you can capture screenshots, add explanations, comments, etc. and create the demo.
  19. Text Editor

    1. Notepad++: Source code editor. 
    2. Notepad2Light-weight feature rich Notepad-like text editor.
    3. sublimetext: A feature rich text editor.
  20. Documentation

    1. GhostDocGhostDoc is a Visual Studio extension that automatically generates XML documentation comments for methods and properties based on their type, parameters, name, and other contextual information.
    2. helpndoc: helpndoc is a tool to create help files. It can generate files in different formats from a single source.
  21. Others

    1. FileZilla: FileZilla is a free FTP solution. FileZilla Client for FTP file uploadingand FileZilla Server for file share.
    2. TreeTrimTreeTrim is a tool that trims the source code tree. It removes debug files, source control bindings, and temporary files.
    3. BrowserStack: Cross browser testing website.
    4. Firebug: Feature rich firefox add on for CSS, HTML and JavaScript development on generated web page.
    5. BugShooting: Screen capture software which takes a screen shot and attaches to the work items, bugs, issue tracker items, etc.
    6. Web developer checklist: The checklist ensures best practices for web development.
    7. XRAY: Firefox add-on. Feature rich bookmarklet. Provides information about element in webpage.
    8. PowerGUIHelps to quickly adopt and use PowerShell to efficiently manage your entire Windows environment.
    9. Beyond Compare: It allows to compare the contents of directory trees and individual files. It is very adaptable with plug-ins for popular languages. [Contribute by: Ron Matuszek]
    10. Devart Codecompare: File diff tool that reads structure of C#, C++,VB code for better results. Includes: Folder comparison tool, standalone app for comparing and merging files and folders, code review support. [Contribute by: Cheung Tat Ming]



Top 10 Characteristics Of A Good Website

A website is a public application that usually targets any number of users. If you’re building a website, you want to make sure you build something that is likeable and usable. In this article, I talk about top 10 characteristics a good website must possess.


A website is designed to serve a purpose, usually to solve a problem. For example, a job board has a purpose where employers can post jobs and job seekers can find and apply for jobs. Once applied, there should be a way for candidates and employers to communicate and keep up to date with a job application. If you build a job board and it only lets you post jobs, that’s not enough.


A website should be easy to use and navigate. When users visit your website, do they find the information they are looking for, without struggling? Does your website provide easy navigation to jump from one page to another and go back?

Relevant Content

You do not want to put content on a website that is not relevant to the users. You do not want to put car details on a job board. If your website is a job board, it should have content and tips related to being a good candidate such as how to create a professional resume and how to behave in an interview. You do not want to post about cars or sports on a job board.


You want to make sure your website is using current trends and technologies. You do not want to build a website that does not support today’s needs. For example, responsiveness and fluid web designs are the key requirements for modern websites. You do not want to create fixed page layouts for your website that doesn’t support mobile readability.


Your website and its content should be optimized for different devices, browsers, data speed, search engines, and users. If your website is not optimized for mobile data users and their download speed, users may leave your website. If your website does not support common modern browsers, you may be missing out on some users. If your website is not optimized for popular smartphones and their sizes, users may not want to visit your website.


Responsive web design is a modern need. A responsive website changes its layout and options to fit the device and browser size. For example, a website may provide more options on a large PC monitor compared to on a mobile phone.

Performance and Speed

Does your website load fast enough to show visitors what they are looking for? Your website can’t be slow when presenting content to its visitors. If your website takes more than two seconds to load, it is probably too slow.


Is your website reliable? If I apply for a job, does your website send me on-time notifications and messages to keep me posted with the updates? Can I access your website whenever and wherever? Is your website up and running 24/7?


Do you have sufficient infrastructure to support your website and its visitors? A website should be able to scale to a number of potential visitors. Not only should the website’s user interface be scalable but the back-end database, APIs, and services too should be able to scale.


Security is a major concern to today’s web visitors. You need to make sure that your website follows industry standards and guidelines. For example, if you have user registration feature, you want to make sure that user passwords are encrypted and not displayed in plain text. You also want to ensure that the website is secure and uses SSL encryption. If you’ve forgotten a password feature, you do not want to provide a reset password feature without asking the security questions to the user.



Tác giả: Luật sư Lê Luân.

+ Có 2 thứ bạn nên tiết kiệm, đó là sức khỏe và lời hứa.

+ Có 2 thứ bạn phải cho đi, đó là tri thức và lòng tốt.

+ Có 2 thứ bạn phải thay đổi, đó là bản thân và nhận thức.

+ Có 2 thứ bạn phải giữ gìn, đó là niềm tin và nhân cách.

+ Có 2 thứ bạn phải trân trọng, đó là gia đình và hiện tại.

+ Có 2 thứ bạn phải tự mình thực hiện, đó là lao động và chịu trách nhiệm với việc mình làm.

+ Có 2 thứ bạn phải lãng quên, đó là đau thương và hận thù.

+ Có 2 thứ bạn phải khắc ghi, là công ơn Mẹ Cha và sự giúp đỡ của người khác.

+ Có 2 thứ bạn buộc phải có để là người thành công, đó là đam mê và lòng kiên trì.

+ Có 2 thứ bạn không được làm, đó là hãm hại người khác và phản bội lòng tin.

+ Có 2 thứ bạn phải bảo vệ, đó là danh tín và lẽ phải.

+ Có 2 thứ bạn phải chấp nhận, là cái chết và sự khác biệt.

+ Có 2 thứ bạn phải kiểm soát, đó là bản năng và cảm xúc.

+ Có 2 thứ bạn phải tránh xa, đó là cám dỗ và sự ích kỷ.

+ Có 2 thứ bạn luôn phải sử dụng mà đừng hà tiện, là tiền bạc và kinh nghiệm.

+ Có 2 thứ bạn không được sợ sệt, là cái ác và sống thật.

+ Có 2 thứ bạn phải nuôi dưỡng, là tình yêu và sự bao dung.

+ Có 2 thứ mà bạn cần phải đạt được trong cuộc sống, đó là thành đạt và hạnh phúc.

+ Có 2 thứ bạn phải luôn sẵn sàng, đó là khó khăn và ngày mai.

+ Có 2 thứ bạn phải luôn ghi nhớ, đó là thực hiện những điều trên và làm thật tốt chúng trong cuộc sống hàng ngày.

Làm sao có 1h cho ước mơ?

Hôm trước mình đã giật mình khi đọc được câu chuyện về một nữ y tá người Úc Bronnie Ware. Sau nhiều năm tiếp xúc với các bệnh nhân giai đoạn cuối, cô đã xuất bản cuốn sách “The Top 5 Regrets of Dyings” – 5 điều nuối tiếc nhất trước khi chết. Nếu đọc cả năm điều, bạn sẽ thấy rằng đó là những việc họ thực sự mong muốn nhưng không có thời gian để làm.

Một câu hỏi đặt ra là liệu có phải là thiếu thời gian thật không? Vì ai cũng có 24 giờ, tại sao có người dành được thời gian cho ước mơ, có người lại không làm được. Sau khi đọc bài viết này, bạn sẽ biết sự thật, đồng thời nắm trong tay một công cụ cực đơn giản, song đã giúp mình dành được ít nhất 1 giờ mỗi ngày cho ước mơ từng bị lãng quên.

Đã bao giờ bạn định làm gì đó khoảng 10 giây, nhưng sau đó lại mất đến cả nửa tiếng? Đã bao giờ bạn định làm thứ gì đó theo kế hoạch, song có việc xen ngang khiến bạn bỏ dở? Có thể bạn nghĩ trong cuộc sống sẽ có lúc gặp việc này việc kia, chúng ta bị “cướp” thời gian một cách trắng trợn. Đồng ý với bạn, song còn những lúc khác thì sao?

“Bạn không bao giờ có đủ thời gian để làm tất cả mọi thứ, nhưng bạn luôn có đủ thời gian để làm những thứ quan trọng nhất”. Đó chính là bí quyết giúp tỷ phú Brian Tracy trở thành ông vua của hiệu suất, suốt 30 năm qua ông đã viết 45 cuốn sách best-seller, tư vấn cho 10.000 công ty, giúp đỡ 5 triệu người trên khắp 55 quốc gia, một kỷ lục phi thường.

Khi còn là sinh viên, mình thoải mái lên các diễn đàn, viết blog, thậm chí tập tẹ viết những trang sách để đời đầu tiên. Mơ ước lớn nhất của mình là xuất bản một cuốn sách. Nhưng khi đi làm, mình hầu như không còn thời gian cho sở thích khi xưa, chạy theo những mục tiêu ngắn hạn khiến mình quên bẵng đi những trang sách dang dở. Mặc dù tự hứa v “tháng tới sẽ xong”, nhưng sau đó 6 năm, mình vẫn dừng lại ở… lời giới thiệu >”< (Update 18/9/2015: trong 3 năm qua, dù đi làm bận rộn, song mình lại có thể hoàn thành tận 2 cuốn, một cuốn đã sắp có mặt trên thị trường, và một quyển tiểu thuyết nữa đang được Nhã Nam biên tập.)

Thật ra về các phương pháp quản lý thời gian mình cũng biết khá nhiều, từ phương pháp ưu tiên 4U nổi tiếng, hay ABCDE của chính Brian Tracy, nhưng thực sự bây giờ mình mới áp dụng được hiệu quả. Tại sao vậy?

“Hãy cho tôi một điểm tựa, tôi sẽ bẩy cả trái đất lên” ~ Archimedes.

Câu nói này gợi ý cho ta rằng mọi sự thay đổi lớn phải có một điểm tựa. Và mình đã tìm ra “điểm tựa” chính xác của kỹ năng quản lý thời gian, một thói quen rất quan trọng giúp tất cả những gì mình biết trước đây về quản lý thời gian bỗng nhiên hoạt động rất hiệu quả!

Trong tháng 10 năm 2013, mình đã dành 3 phút mỗi ngày để ghi lại lượng thời gian mình sử dụng. Và thật bất ngờ, khi nhìn lại bảng tổng kết cuối tháng. Cứ tưởng trước giờ mình làm việc khá hiệu quả, vì liên tục được công ty khen ngợi, nhưng thực ra khi phân tích dữ liệu, mình mới nhận ra khả năng quản lý thời gian của mình tệ hại như thế nào!

Nếu tính một ngày có 24h, trừ 12h cho các việc ăn, ngủ, di chuyển và các việc không tên khác sẽ có khoảng 12h “lý tưởng” để làm những việc đáng kể, bao gồm : đi học, làm việc, làm những thứ có ích, làm những việc phục vụ cho tương lai. Suy ra 1 tháng sẽ có 30 x 12 = 360 giờ đáng kể. Và đây là cách mình tiêu “thời gian” trong khoảng 1/10 tới 31/10.

Tổng thời gian mình ghi nhận là 215.9,  chia cho 360 thì ra khoảng 60%. Như vậy còn lại 40%, tức là 144 giờ của mình đã bị tiêu tốn vào những việc “không tên” khác, những việc mà mình thấy không hữu ích, không phục vụ cho mục tiêu nào của mình cả nên đã không được ghi vào. Mà với 144 giờ, với tốc độ 2 trang/giờ, ít nhất mình có thể viết 288 trang, đủ 1 cuốn sách!!!

Và nếu bạn biết ABC là gì, thì bạn sẽ thấy không những mình bị “cướp trắng” 144 giờ, mà cách mình tiêu 216 giờ kia cũng không hợp lý chút nào. ABC là gì vậy nhỉ?

A ở đây là những công việc mang tính chất “Áp lực”. Ví dụ như xem lại nội dung trước giờ giảng dạy, làm một việc bất chợt mà các sếp giao, tham gia một cuộc họp bắt buộc v.v… nói chung là những việc quan trọng và khẩn cấp, phục vụ mục tiêu ngắn hạn, không làm là sẽ có hậu quả ngay. A là những việc phải làm trước tiên, song không phải là những việc nên làm nhiều nhất.

B là những việc “Bé bự”, tức là những việc cũng quan trọng những không khẩn lắm, nó thường phục vụ cho mục tiêu lâu dài như là viết sách, viết blog, lập kế hoạch, đọc sách phát triển bản thân v.v… không làm nó thì cũng có hậu quả, nhưng về lâu dài mới thấy. B có thể là những việc có thể để sau, nhưng bạn phải có kế hoạch cho nó, nếu không nó sẽ sớm thành việc A.

C là “Cân bằng”, là những việc giúp bạn thư giãn, giải trí, lấy lại cân bằng một cách tích cực, giống như Vitamin C vậy. Ví dụ như đọc một cuốn truyện mình yêu thích, nghe những bản nhạc hay, xem một chương trình TV hữu ích, nhưng nó phải tích cực nhé, chứ những việc như thi thoảng nằm ườn một chỗ chán đời, không muốn làm gì mấy tiếng liền thì không tính.

Làm quá nhiều việc A sẽ giải thích cho tình trạng căng thẳng của mình hiện tại, cũng như sự vắng bóng trên mạng, Blog mốc meo cả mấy tháng. Từ đó dẫn tới việc B quá ít, không có thời gian cho ước mơ, cuộc sống sẽ ngày càng mất đi ý nghĩa. Khi việc C cũng ít, bạn không có thời gian cho sở thích, thì mất cân bằng là điều tất yếu khó tránh khỏi.

Hãy nhớ xem đã bao lần bạn đọc một cuốn sách, tham dự hội thảo và tràn trề động lực thay đổi, Nhưng rồi sau đó mọi thứ lại đâu vào đấy? Ngược lại, hãy nhớ xem có một lần nào đó, khi tự bạn nhận ra rằng mình phải thay đổi, và bạn đã thay đổi. Sự thay đổi không xảy ra khi người khác bảo ta, mà xảy ra khi ta nhận mình phải thay đổi!

Và khi đối mặt với thực tế ấy, động lực thay đổi trở nên mạnh mẽ hơn bao giờ hết! Nó đã kích thích mình mạnh dạn thay đổi chiếc lược làm việc hàng ngày, hàng tuần, hàng tháng. Mình quyết tâm theo đuổi 3 nguyên tắc :

  1. Nếu có thể làm trước, hãy làm trước đó 1 tuần (thậm chí cả tháng)
  2. Nếu có thể nhờ ai đó làm, mạnh dạn thuyết phục họ;
  3. Nếu việc có việc “áp lực” thì cố làm càng nhanh càng tốt.

Đặc biệt, phải quyết ghi chép thời gian để hàng ngày theo dõi. Và đây là thành quả tháng 11!

Tổng thời gian “đáng kể” đã tăng lên 285.2 giờ, tỷ lệ 79.4% tuy chưa tuyệt đối nhưng quả thật là tuyệt vời. Không những vậy, thời gian việc B và C của mình đã tăng lên, điều đó có nghĩa là mình đã dành được thời gian cho bản thân, cho ước mơ nhiều hơn mà hiệu suất làm việc mình vẫn tốt, việc A vẫn đạt 107.5 tương đương tháng trước. Từ ABC, mình đã chuyển thành BAC ^^!

BÁC Hồ từ trước tới nay luôn là tấm gương của sự tiết kiệm mà! Song giờ đây không những tiết kiệm của cải vật chất, mà còn tiết kiệm một thứ hết sức quan trọng. Đó là của cải thời gian, vì không những nó có thể sinh ra tiền, mà cả hạnh phúc và tự do!

Nói tóm lại, nếu ví thời gian như tiền bạc, thì việc ghi chép thời gian sẽ giúp bạn thật sự nhận ra mình đang quản lý thời gian như thế nào.Từ đó bạn mới có thể thay đổi hợp lý, cũng như động lực để duy trì sự thay đổi đó. Chứ cái cảm giác “mình quản lý thời gian chưa hiệu quả” chung chung, sẽ không thể nào giúp bạn thay đổi đâu!

Ngay bây giờ, hãy lấy ngay một tờ giấy và viết, hoặc comment ở dưới xem từ sáng tới giờ khi bạn thức dậy (hoặc là hôm qua), bạn đã làm những công việc gì đáng kể (ít nhất 30 phút)? Bạn làm chúng trong bao nhiêu lâu? Đó là việc loại A hay B hay C?

Hãy nhớ, có thể bạn không có thời gian để làm tất cả, nhưng bạn luôn có thời gian để làm những thứ quan trọng nhất. Và với mình, không gì quan trọng hơn bằng việc dành 3 phút ghi lại những giờ đáng kể. Ngay bây giờ ^^!

Cuối cùng, tặng bạn một vài công cụ để ghi chép thời gian :

Nếu thích online bạn có thể đặc làm trang chủ để mỗi lần lướt web, bạn không bao giờ quên việc phải ghi chép thời gian.

Còn nếu bạn dùng hệ điều hành ubuntu thì có cài hamster project để được nhắc cứ mỗi 15 phút! và có thể tạo ra bảng ghi chép bên trên giống mình.

Update : Hiện mình đã chuyển sang một công cụ cực đơn giản là… excel ^^! Bạn có thể xem hướng dẫn tại : hoặc clip


Nén GZIP cho Website ASP.NET và ASP.NET MVC

Chào mọi người!
Hôm nay ngồi kiểm tra lại phần dữ liệu trả về của trang lộ trình và trang giám sát online thì mình đã có một số kinh nghiệm, muốn chia sẻ lại với các bạn.
1. Trang lộ trình
– Trước khi chỉnh lại, khi xem 1 xe dữ liệu trả về là: 5,8 MB
– Sau khi chỉnh lại, dữ liệu trả về chỉ còn: 159 KB => giảm tới 36 lần, 1 con số giật mình
2. Trang online
– Trước khi chỉnh lại, dữ liệu trả về 1 phiên thường là 600KB
– Sau khi chỉnh lại, dữ liệu trả về 1 phiên chỉ còn: khoảng 35KB => giảm tới 17 lần.
3. Kỹ thuật để giảm tải dữ liệu trả về
– Dữ liệu bên mình làm việc chủ yếu là JSON, khi đặt tên thuộc tính mà dài thì tên của key còn nhiều hơn cả value => mình đã chỉnh lại tên khi JSON trả về ngắn nhất có thể
+ Dữ liệu trước khi giảm
"LatLng":"21,008797, 105,854355",
"Message":"Có khách",

+ Dữ liệu sau khi giảm

"p9":"Có khách",

+ Như các bạn đã thấy, mình đã chuyển tên các thuộc tính về ngắn nhất có thể, và các giá trị dạng bool mình đã gom lại cho p12 (dạng Flags và mình sẽ dùng bitwise ở phía client để giảm tải dữ liệu đi về.)
+ Với cách cắt giảm như trên thì mình đã tiết kiệm dữ liệu từ 5,7MB xuống còn 1,4MB (Giảm khá nhiều, nhưng cần thêm 1 lần nữa để giảm triệt để hơn)
– Bật chức năng GZIP có sẵn trong ASP.NET để giảm kích thước trả về
+ Thực ra đây là phần có sẵn của ASP.NET, mình chỉ cần khai báo 1 ít trong Global.asax là có thể giảm khá nhiều.
protected void Application_BeginRequest(object sender, EventArgs e)
HttpApplication app = (HttpApplication)sender;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
System.IO.Stream prevUncompressedStream = app.Response.Filter;

if (acceptEncoding == null || acceptEncoding.Length == 0)

acceptEncoding = acceptEncoding.ToLower();

if (acceptEncoding.Contains(“gzip”))
// gzip
app.Response.Filter = new System.IO.Compression.GZipStream(prevUncompressedStream,
else if (acceptEncoding.Contains(“deflate”))
// defalte
app.Response.Filter = new System.IO.Compression.DeflateStream(prevUncompressedStream,

+ Sau khi khai báo GZIP, dữ liệu của mình từ 1,4 MB => 159 KB (Giảm khoảng gần 9 lần)
– 1 số link tham khảo

A Ready To Use Software Licensing Solution in C#


First, I’d like to show you a live demo for this solution.

A Simple Example

I had a application haveing feature 1, 2 and 3,  and I want user to pay for each feature they like instead of paying for the whole package. So I designed a license solution to make this possible.

Current Solution

1) My application launches and finds itself not activated

2) It displays the activiation form and show the current device UID for purchasing a license

3) User shall give this device UID to our vendor to purchase the license, via either mail or phone.

4) At our vendor side, there is a license issuer program to issue the license based on the device UID and those features the user bought.

5) After license is generated, vendor shall paste the license string into a text file or mail to our user for activation.

6) User use paste the license string into the activiation form to activate the application.

Well, if this make you interested, please read on.

The highlights of this solution is:

  • digital signature technology is used to protect the license file
  • XML based license file allows it to contain rich information needed by the application
  • support both single license mode and volume license mode.
  • for single license mode, PC’s unique key is generated based on PC’s hardware. And BASE36 algorithm is used to generate the unique key for easier usage.

As I learnt, the key concept of such a license solution has been introduced years ago, even there are similar articles on CodeProject as well. However, it seems to be no ready-to-use solution or library out there. So it is a chance for me to do it!


I was working on a project that is a system having many key features, which are expected to be actived or deactived based on the license provided. Boses want the feature on/off mechanism of the licensing system to be highly flexible, so the idea of pre-defined different editions is not suitable for this purpose.

The benefits is end user can just pay for those feature he/she want. E.g., user A can only pay for feature A, B & C; while user B only want feature A & C, and user C may only pay for feature B.

A good idea is to put those active features into a XML list and use this list as the license file. However, the next question is how to protect this license file since it is juat a plain text XML. Finally the digital signature solution answers the question.

Major Ideas

Main Workflow

The below chart describe the main workflow of this licensing solution:


  1. End User Application generates the Unique ID for the current PC.
  2. Unique ID will be passed to License Issuer. This shall be a offline step which may include additional actions such as purchase and payment.
  3. License Issuer issue the license file based on the Unique ID and license options. I.e., decide to enable which features based on the purchase and payment.
  4. Send back the license file to end user. This is also a offline step, maybe by mails or USB drivers.
  5. End User Application verify the license file and startup.

Unique ID for the device

For now, this solution is only used on PC, also including servers & laptops. It has not been used in mobile devices yet. I think the algorithm to get unique ID for mobile devices shall be different. Here we just talk about PC first.

The unique ID for a PC contains 4 parts:

  • Application Name
  • Processor ID
  • Motherboard Serial Number
  • Disk Volume Serial Number of Drive C

The 4 parts are concatenated as strings, then checksum is generated via MD5. And BASE36 encoding is used to format the checksum into a string like “XXXX-XXXX-XXXX-XXXX” for easier reading and transferring.

/// <summary>
/// Combine CPU ID, Disk C Volume Serial Number and Motherboard Serial Number as device Id
/// </summary>
/// <returns></returns>
public static string GenerateUID(string appName)
    //Combine the IDs and get bytes
    string _id = string.Concat(appName, GetProcessorId(), GetMotherboardID(), GetDiskVolumeSerialNumber());
    byte[] _byteIds = Encoding.UTF8.GetBytes(_id);

    //Use MD5 to get the fixed length checksum of the ID string
    MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();
    byte[] _checksum = _md5.ComputeHash(_byteIds);

    //Convert checksum into 4 ulong parts and use BASE36 to encode both
    string _part1Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 0));
    string _part2Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 4));
    string _part3Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 8));
    string _part4Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 12));

    //Concat these 4 part into one string
    return string.Format("{0}-{1}-{2}-{3}", _part1Id, _part2Id, _part3Id, _part4Id);

XML based license file

So, in order to let the license file contain more information, a XML based license file is necessary. In C#, we can easily use XML Serializer to serialize the object into XML and vice verca.

The basic license entity is defined as below: (Some codes may contains Chinese, will do multiple language later)

public abstract class LicenseEntity
       public string AppName { get; protected set; }

       public string UID { get; set; }

       [ShowInLicenseInfo(true, "Type", ShowInLicenseInfoAttribute.FormatType.EnumDescription)]
       public LicenseTypes Type { get; set; }

       [ShowInLicenseInfo(true, "Creation Time", ShowInLicenseInfoAttribute.FormatType.DateTime)]
       public DateTime CreateDateTime { get; set; }

       public abstract LicenseStatus DoExtraValidation(out string validationMsg);


It contains 3 default properties:

  • UID, which is the device’s unique ID (Used to identify the specified device for single license. Not used for volume license)
  • Type, indicate it is a single license or volume license
  • CreateDateTime, indicate when is the license created

Since this is an abstract class, you can just extend it for additional properties by inheriting it.

Protect the license file

OK, now we have the license file and enough information we need. The problem is that a XML file for licensing is very weak because anyone can modify it. Thus we need to introduce digital signature solution.

Generate a certificate

To use digital signature, first of all, we need a pair of RSA keys. Private key for system owner to sign the XML file. And the public key for end user’s application to verify the signed XML license file.

A easy way is to use “makecert” command to generate the certificates which we need to sign and verify the XML license file. Details will be covered in the later part of this article, please keep reading!

Sign the license file

C# provides native support for digital signature, so it is very easy to sign the XML license file as below: (These codes are copied from Microsoft samples)

// Sign an XML file.
// This document cannot be verified unless the verifying
// code has the key with which it was signed.
private static void SignXML(XmlDocument xmlDoc, RSA Key)
    // Check arguments.
    if (xmlDoc == null)
        throw new ArgumentException("xmlDoc");
    if (Key == null)
        throw new ArgumentException("Key");

    // Create a SignedXml object.
    SignedXml signedXml = new SignedXml(xmlDoc);

    // Add the key to the SignedXml document.
    signedXml.SigningKey = Key;

    // Create a reference to be signed.
    Reference reference = new Reference();
    reference.Uri = "";

    // Add an enveloped transformation to the reference.
    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();

    // Add the reference to the SignedXml object.

    // Compute the signature.

    // Get the XML representation of the signature and save
    // it to an XmlElement object.
    XmlElement xmlDigitalSignature = signedXml.GetXml();

    // Append the element to the XML document.
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));


Now we are ready to publish the license for for end users. The last ‘optimization’ is to flat the XML so I encoded it with BASE64 and put all the output into a plain text file as the license.

Verify the license file

When the license file file is installed on the end user’s PC, the end user’s application shall populate the public key file and verify the license file using it.

// Verify the signature of an XML file against an asymmetric
// algorithm and return the result.
private static Boolean VerifyXml(XmlDocument Doc, RSA Key)
    // Check arguments.
    if (Doc == null)
        throw new ArgumentException("Doc");
    if (Key == null)
        throw new ArgumentException("Key");

    // Create a new SignedXml object and pass it
    // the XML document class.
    SignedXml signedXml = new SignedXml(Doc);

    // Find the "Signature" node and create a new
    // XmlNodeList object.
    XmlNodeList nodeList = Doc.GetElementsByTagName("Signature");

    // Throw an exception if no signature was found.
    if (nodeList.Count <= 0)
        throw new CryptographicException("Verification failed: No Signature was found in the document.");

    // This example only supports one signature for
    // the entire XML document.  Throw an exception
    // if more than one signature was found.
    if (nodeList.Count >= 2)
        throw new CryptographicException("Verification failed: More that one signature was found for the document.");

    // Load the first <signature> node.

    // Check the signature and return the result.
    return signedXml.CheckSignature(Key);

If the above verification is successful, the application starts to read the XML contents and can turn related features on/off accordingly.

About the Library

The whole .NET solution is built based on .NET Framework Version 4.0, in order to provide maximum compatibility even for retired Windows XP.

What I Have Provided

There are 5 projects inside this solution, which are split into 2 parts:

Core Libraries:

It contains 2 projects. One is QLicense which contains the core objects and logic. The other is ActivationControls4Win which contains the related Windows Form Controls for easy usage.


This part contains a demo application which uses the above license solution and a demo activation tool which issues the license.

What You Need To Do

Step by Step is here for how to use this library. I will use those demo projects as a sample to describ how to create your own application that integrats this license solution.

1. Create your certificates for your application

It is recommended that you create a new set of certificates for each of your new application, this is for security consideration.

1) You can just use makecert command to do this like:

makecert -pe -ss My -sr CurrentUser -$ commercial -n "CN=<YourCertName>" -sky Signature

Replace “<YourCertName>” with your own certificate name.

2) After executing the above command, open your Certificate Management window by runninig “certmgr.msc”.

3) Find the created certificate under “Personal” category with the name you specified in <YourAppName> above.

4) Right click on the certificate and select “All Tasks”->”Export”

5) On the Export dialogue, select “Yes, export the private key” and leave the other settings as default.

6) On the password diaglogue, input a password to protect the private key. You need to copy this password in your code when using this certificate. E.g., we use password “demo” here.

7) For the file name, we may use “LicenseSign.pfx” for this demo. Now we have the certificate with private key on hand.

8) Do step 4) to step 7) again to export the public key, just the difference is to choose “No, do not export the private key” and use file name as “LicenseVerify.cer” instead. Leave all the other options as default.

Well, we now have both the private key and public key generated for our solution.

2. Create your own license entity class – “DemoLicense”

1) You need to create a Class Library project which contains your own license entity, naming it “DemoLicense” for example.

2) Add Reference to QLicense library

3) Create a new class naming “MyLicense” and inherits “QLicense.LicenseEntity”

4) Add your own properties as you need

And the final codes shall look like:

using QLicense;
using System.ComponentModel;
using System.Xml.Serialization;

namespace DemoLicense
    public class MyLicense : QLicense.LicenseEntity
        [DisplayName("Enable Feature 01")]
        [Category("License Options")]        
        [ShowInLicenseInfo(true, "Enable Feature 01", ShowInLicenseInfoAttribute.FormatType.String)]
        public bool EnableFeature01 { get; set; }

        [DisplayName("Enable Feature 02")]
        [Category("License Options")]        
        [ShowInLicenseInfo(true, "Enable Feature 02", ShowInLicenseInfoAttribute.FormatType.String)]
        public bool EnableFeature02 { get; set; }

        [DisplayName("Enable Feature 03")]
        [Category("License Options")]        
        [ShowInLicenseInfo(true, "Enable Feature 03", ShowInLicenseInfoAttribute.FormatType.String)]
        public bool EnableFeature03 { get; set; }        

        public override LicenseStatus DoExtraValidation(out string validationMsg)
            //Here, there is no extra validation, just return license is valid
            validationMsg = string.Empty;
            return LicenseStatus.VALID;


XmlElement attribute indicates the element name when the object is serilized into XML.

ShowInLicenseInfo attribute indicates whether this property shall be displayed in LicenseInfoControl which is a WinForm control contained in ActivationControls4Win project.

3. Integrate QLicense library with your application – “DemoWinFormApp”

1) Add Reference to DemoLicense, QLicense and ActivationControls4Win

2) Add LicenseVerify.cer generated in step 1 into the project, make it as Content and Copy to Output Directory If Newer in the file property settings.

3) Put the LicenseInfoControl from ActivationControls4Win onto the form you’d like to show license details, such as About form. For the demo, I just put it on the main form.

4) The main logic for the main form is to validate the license and inform user to activate the application if needed. I put the logic in Form_Shown event in order to let main form shown in the backgound for better user experience. You may put these logic into a splash form or other place.

private void frmMain_Shown(object sender, EventArgs e)

    //Initialize variables with default values
    MyLicense _lic = null;
    string _msg = string.Empty;
    LicenseStatus _status = LicenseStatus.UNDEFINED;

    //Check if the XML license file exists
    if (File.Exists("license.lic"))
        _lic = (MyLicense)LicenseHandler.ParseLicenseFromBASE64String(typeof(MyLicense), File.ReadAllText("license.lic"), "LicenseVerify.cer", out _status, out _msg);
        _status = LicenseStatus.INVALID;
        _msg = "Your copy of this application is not activated";

    switch (_status)
        case LicenseStatus.VALID:

            //TODO: If license is valid, you can do extra checking here
            //TODO: E.g., check license expiry date if you have added expiry date property to your license entity
            //TODO: Also, you can set feature switch here based on the different properties you added to your license entity

            //Here for demo, just show the license information and RETURN without additional checking


            //for the other status of license file, show the warning message
            //and also popup the activation form for user to activate your application
            MessageBox.Show(_msg, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Warning);

            using (frmActivation frm = new frmActivation())

                //Exit the application after activation to reload the license file
                //Actually it is not nessessary, you may just call the API to reload the license file
                //Here just simplied the demo process


4) Add a new form named frmActivation and put LicenseActivateControl from ActivationControls4Win onto it. This is the form user need to enter license content and activate your application.

5) Here is the main logic for frmActivation. It will display the calculated device UID once the form popup:

private void btnCancel_Click(object sender, EventArgs e)
           if (MessageBox.Show("Are you sure to cancel?", string.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

       private void frmActivation_Load(object sender, EventArgs e)
           //Assign the application information values to the license control
           licActCtrl.AppName = "DemoWinFormApp";
           licActCtrl.LicenseObjectType = typeof(DemoLicense.MyLicense);
           licActCtrl.CertificatePublicKeyFilePath = Path.Combine(Application.StartupPath, "LicenseVerify.cer");
           //Display the device unique ID

       private void btnOK_Click(object sender, EventArgs e)
           //Call license control to validate the license string
           if (licActCtrl.ValidateLicense())
               //If license if valid, save the license string into a local file
               File.WriteAllText(Path.Combine(Application.StartupPath, "license.lic"), licActCtrl.LicenseBASE64String);

               MessageBox.Show("License accepted, the application will be close. Please restart it later", string.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information);


4. Create your license issuer tool – “DemoActivationTool”

1) Create a new Windows Form Application project, naming “DemoActivationTool”.

2) Add References to DemoLicense, QLicense and ActivationControls4Win

3) Add LicenseSign.pfx generated in step 1 into the project, make it as Content and Copy to Output Directory If Newer in the file property settings.

4) Draw the control LicenseSettingsControl and LicenseStringContainer on the main form, it may look like:

5) Add the following codes for main form. Details are explains inline with the codes as comments below:

public partial class frmMain : Form
    private const string CERT_PWD = "demo";
    private const string CERT_NAME = "LicenseSign.pfx";

    public frmMain()

    private void frmMain_Load(object sender, EventArgs e)
        //Initialize the path for the certificate to sign the XML license file
        licSettings.CertificatePrivateKeyFilePath = Path.Combine(Application.StartupPath, CERT_NAME);
        licSettings.CertificatePassword = CERT_PWD;

        //Initialize a new license object
        licSettings.License = new MyLicense();

    private void licSettings_OnLicenseGenerated(object sender, QLicense.Windows.Controls.LicenseGeneratedEventArgs e)
        //Event raised when license string is generated. Just show it in the text box
        licString.LicenseString = e.LicenseBASE64String;

    private void btnGenSvrMgmLic_Click(object sender, EventArgs e)
        //Event raised when "Generate License" button is clicked.
        //Call the core library to generate the license
        licString.LicenseString = LicenseHandler.GenerateLicenseBASE64String(
            new MyLicense(),
            Path.Combine(Application.StartupPath, CERT_NAME),




Speech recognition, speech to text, text to speech, and speech synthesis in C#

Some content on this page was disabled on December 28, 2015 as a result of a DMCA takedown notice from CodeProject Solutions Inc.. You can learn more about the DMCA here: