Chuyển đến nội dung chính

Bài đăng

Hiển thị các bài đăng có nhãn C#

Hướng Dẫn Sử Dụng PDFSharp

PDFSharp là một thư viện mạnh mẽ và miễn phí dùng để tạo, chỉnh sửa và xử lý các tệp PDF trong các dự án .NET. Bài viết này sẽ hướng dẫn bạn cách cài đặt và sử dụng cơ bản thư viện này. Cài đặt Các bước để tạo 1 file pdf đơn giản: dotnet add package PdfSharp 1. Tạo file PDF cơ bản: Tạo đối tượng PdfDocument() var document = new PdfDocument(); 2. Thêm 1 page mới, chọn page size var page = document.AddPage(); page.Size = PdfSharp.PageSize.A4; 3. Tạo đối tượng đồ họa để draw var gfx = XGraphics.FromPdfPage(page); 4. Thiết lập font chữ XFont font = new XFont("Arial", 16, XFontStyleEx.Bold); 5. Vẽ văn bản lên trang PDF 6. Lưu tài liệu PD Dưới đây là ví dụ hoàn chỉnh using PdfSharp.Drawing; using PdfSharp.Pdf; Console.WriteLine("Hello, World!"); var document = new PdfDocument(); document.Info.Title = "Demo PDFSharp"; var page = document.AddPage(); page.Size = PdfSharp.PageSize.A4; var gfx = XGraphics.FromPdfPage(page); XFont font = new XFont("Aria

Hướng dẫn sử dụng DependencyResolver trong Custom Validation Attribute

Custom Data Annotation (Attribute) là gì? Data Annotation trong ASP.NET MVC là một cách để bạn thêm các thuộc tính (metadata) vào các thuộc tính của model, cung cấp thông tin bổ sung về cách dữ liệu đó sẽ được xử lý. Custom Validation Attribute là một cách để bạn tự định nghĩa các quy tắc validate dữ liệu riêng cho các thuộc tính của model trong ASP.NET MVC. Nó kế thừa từ lớp ValidationAttribute và cho phép bạn tạo các logic validate phức tạp hơn so với các Data Annotation có sẵn. Ví dụ: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class NotEqualToAttribute : ValidationAttribute { private const string DefaultErrorMessage = "{0} cannot be the same as {1}."; public string OtherProperty { get; private set; } public NotEqualToAttribute(string otherProperty) : base(DefaultErrorMessage) { if (string.IsNullOrEmpty(otherProperty)) { throw new ArgumentNullException("otherPro

Fluent Validation trong .NET

Validation là gì? Là quá trình kiểm tra dữ liệu người dùng (End User) nhập liệu đã đúng với các Quy tắc ràng buộc dữ liệu hay chưa? Tránh dữ liệu gởi đến Server là không chính xác/không sử dụng được (dữ liệu rác). Trong lập trình C# và nhiều ngôn ngữ lập trình khác, việc xác thực dữ liệu (validate data) là một phần quan trọng của việc phát triển ứng dụng, vì nó giúp đảm bảo tính nhất quán, an toàn và đáng tin cậy của hệ thống. Dưới đây là 1 ví dụ về việc sử dụng Validation trong C# Trong ví dụ này, chúng ta sẽ tạo 1 console application để nhận data từ console app. Khai báo Person public class Person { public string FirstName { get; set; } public string LastName { get; set; } } Thực hiện việc kiểm tra trong hàm Validate() var person = new Person(); // Get data Console.WriteLine("Enter first name:"); person.FirstName = Console.ReadLine(); Console.WriteLine("Enter last name:"); person.LastName = Console.ReadLine(); if (string.IsNullOrWhiteSpace(person.Fir

Serrilog: Sử dụng Serilog trong ASP.NET Core 7.0 - Part 2

Trong bài viết này, chúng ta sẽ tìm hiểu cách thực hiện ghi log có cấu trúc bằng Serilog trong asp.net core 7.0. Logging là một phần thiết yếu của một ứng dụng. Nó giúp chúng ta theo dõi ứng dụng và thậm chí giúp chúng ta tìm ra nguyên nhân root cause sau khi triển khai ứng dụng lên production. Setup Cài đặt package Install-Package Serilog.AspNetCore Mở file Program.cs, giả sử chúng ta update như sau: using Serilog; Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); try { Log.Information("Starting web host"); var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Host.UseSerilog(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly"); } finally { Log.CloseAndFlush(); } Bấm F5 chạy, chúng ta sẽ có kết quả như sau: [

Kết hợp Newtonsoft.Json và System.Text.Json để xử lý đối tượng với chức năng serialization và Deserialization

Giới thiệu Các dữ liệu JSON thường được sử dụng trong ứng dụng web, đặc biệt là Web API, Serverless. Chính vì vậy từ .NET Core 3.0, Microsoft đã đưa System.Text.Json vào Framework và ngày càng xử lý tốt hơn. Trong bài viết này, mình sẽ tìm hiểu cách sử dụng cơ bản của 2 thư viện trên, và cách xử lý lỗi khi serialize object trên Azure Functions. JSON là gì? JSON là viết tắt của JavaScript Object Notation, là một kiểu định dạng dữ liệu tuân theo một quy luật nhất định mà hầu hết các ngôn ngữ lập trình hiện nay đều có thể đọc được. JSON là một tiêu chuẩn mở để trao đổi dữ liệu trên web. Serialize và deserializie là gì? Trong C#, serialization là quá trình chuyển đổi đối tượng sang byte stream để có thể lưu vào memory, file hoặc database. Quá trình ngược lại gọi là deserialization Serialize an object Deserialzie byte stream to object Ví dụ sử dụng serialization và deserialization Tạo 2 class Person và Pet class Person { public string Name { get; set; } public int Age { get; set; }

Convert từ kiểu ExpandoObject sang kiểu dữ liệu cụ thể

Giả sử bạn có class Person public class Person { public string Name { get; set; } public int Age { get; set; } } Bạn có data dynamic như sau: using System.Dynamic; dynamic expando = new ExpandoObject(); expando.Name = "John Doe"; expando.Age = 30; expando.Address = new ExpandoObject(); expando.Address.State = "WA"; Console.WriteLine(expando.Address.State); Cách 1 using ExpandoObjectExample; using Newtonsoft.Json; //--your old code var convertedObject = JsonConvert.DeserializeObject<Person>(JsonConvert.SerializeObject(expando)); Console.WriteLine(convertedObject.Name); Cách 2 public static TObject ToObject<TObject>(this IDictionary<string, object> someSource, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public) where TObject : class, new() { Contract.Requires(someSource != null); TObject targetObject = new TObject(); Type targetObjectType = typeof(TObject); // Go through all bound target object type properties..

Copy và paste Tablix trong SSRS

Đầu tiên, bạn cần cài đặt extension Microsoft Reporting Services Projects: https://marketplace.visualstudio.com/items?itemName=ProBITools.MicrosoftReportProjectsforVisualStudio   Tạo new project và add file rdl vào. Bạn dùng Visual Studio để phát triển thay vì sử dụng Report Builder Copy Tablix Để copy Tablix, bạn cần comment đoạn custom code Code.MyCustomeCode(). Trường hợp nếu bạn không comment, sau khi copy paste, bạn sẽ có đoạn XML như sau Code.MyCustomeCode Mở Report dưới dạng XML, thay thế: Code. Bằng 'Code. Trở lại Design View, copy và paste Tablix mà bạn cần clone ra. Sau đó quay trở lại XML View, thay thế 'Code. Bằng Code. Tham khảo https://exchangetuts.com/copy-and-paste-a-table-tablix-in-ssrs-1639686368780987

Hướng dẫn cách gởi message lên Telegram

Trong bài viết này, mình sẽ hướng dẫn bạn cách tạo 1 channel mới ở Telegram, tạo mới bot và gởi 1 message đơn giản từ C# application. Các bước: Tạo mới 1 channel Tạo mới 1 bot Gửi message từ console application Tạo mới 1 channel Nhấp vào biểu tượng cây bút -> New Channel Nhập tên Channel, Description, thêm hình ảnh cho Channel, sau đó chọn Public hoặc Private. VD bạn tạo 1 bot tên AAA Tạo 1 bot Mục đích tạo 1 bot ở đây là để bạn có thể gởi message từ application hoặc từ ứng dụng nào đó.  Nhập Botfather tại thanh tìm kiếm, chọn BotFather có stick xanh. Sau đó bạn nhấn nút Start Hệ thống sẽ hiển thị các lệnh liên quan tới việc tạo mới, và chỉnh sửa bot. Nhấp vào /newbot để tạo 1 bot mới. Do telegram khá phổ biến nên bạn phải chọn tên bot sao cho không trùng Lưu ý tên mới của bot phải kết thúc bằng chữ bot: <ten bot>_bot. Bạn sẽ nhận được thông báo bao gồm đường link dẫn đến bot mới và mã HTTP API Telegram. Mã API rất quan trọng trong việc sử dụng Bot Telegram. Sau đó bạn thêm mớ

Tổng hợp tài liệu DotNetNuke (DNN)

Video Installing IIS, Visual Studio 2017 and SQL Server 2016 Express Installing DotNetNuke on Windows 10 Dnn Overview Video Intro to the Persona Bar Setting up your DNN9 Website Site Settings Details How to Upgrade DNN9 How to Create a Page in DNN9 Adding a Module to a Page in DNN9 Installing the DNN9 Extension Templates for Visual Studio 2017 Creating and Packaging a Module in DNN9 C# MVC Module Project Overview   Creating and Packaging a Web-forms Module in DNN 9 C# Web forms module project overview Skin/Theme project creation in Visual Studio 2017 Skin/Theme Project Problems Skin/Theme Project Package and Install Overview Visual Studio Community 2017 Update for Web Application Projects What is a Theme? Tutorials DNN (Formerly DotNetNuke) Tutorial https://www.c-sharpcorner.com/UploadFile/698727/net-nuke-dnn-tutorial-part-1/ ByTutorial 2013

Khai thác dữ liệu web với AngleSharp trong .NET Core

Web scrapping là gì? Web scraping là một quá trình tự động thu thập thông tin từ website. Nói là cách đơn giản là lấy thông tin (html) từ 1 website cụ thể rồi trích xuất data cần thiết. Ứng dụng là việc khai thác dữ liệu là bạn có thể tùy biến để cập nhật tin tức, giá cả cổ phiếu, vàng, ... Hiện tại, có nhiều thư viện hỗ trợ như: AngleSharp và HtmlAgilityPack. Nhưng mình thấy HtmlAgilityPack chưa hỗ trợ .NET Core nên mình quyết định mài mò nghiên cứu AngleSharp. Cài đặt và sử dụng AngleSharp Tạo project Console Application mới. Sau đó cài đặt AngleSharp dotnet add package AngleSharp Khai báo namespace: using AngleSharp; using AngleSharp.Dom; using AngleSharp.Html.Dom; Để thực hiện việc lấy data, bạn không cần khai báo HttpModule. AngleSharp sẽ làm việc đó thay bạn Đoạn code dưới đây sẽ lấy data từ 1 trang web có địa chỉ url, ví dụ trang https://vnexpress.net var config = Configuration.Default.WithDefaultLoader(); var context = BrowsingContext.New(config); var docum

Tìm hiểu về Cancellation trong C# và những điều bạn cần biết

Cancellation token là gì? Cơ chế Task trong C# là 1 tính năng mạnh mẽ trong lập trình Parallel và Concurrent. Vấn đề đặt ra nếu bạn thực hiện đa luồng, thì làm sao để hủy bỏ những những hàm bất đồng. Tại sao chúng ta cần kiểm soát Task? Một trong những lý do là yêu cầu về mặt logic hoặc thuật toán, bên cạnh đó là những luồng không thể kiểm soát được. Và khi hủy bỏ Task, bạn cần throw an exception thay vì trả về một kết quả null (hoặc rỗng). .NET cung cấp 2 class: CancellingTokenSource: là một đối tượng chịu trách nhiệm tạo Cancellation Token và gởi request đến tất cả các hàm chứa đối tượng đó. CancellationToken: là một cấu trúc được dùng để theo dõi trạng thái của Token hiện tại Ví dụ Dừng Task thủ công Phương thức CancellationTokenSource.Cancel() được dùng để hủy Task khi thỏa điều kiện logic Ví dụ dưới đây thực hiện việc tính tổng, khi thỏa điều kiện số ngẫu nhiên = 0 => dừng việc phát sinh số ngẫu

Khắc phục lỗi Retrieving the COM class factory tạo file Excel bằng Microsoft.Office.Interop

Vấn đề Khi tạo file Excel bằng thư viện Microsoft.Office.Interop.Excel, và host ở môi trường IIS, bạn sẽ gặp lỗi: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005

Hướng dẫn sử dụng Log4Net: Viết 1 appender cho Log4Net (Part 2)

Appender là gì? Appender là 1 output cho 1 bản ghi, ví dụ như console, file, email, hoặc là database. Log4Net đã định nghĩa rất nhiều appender mà hầu như chúng ta chỉ cần khai báo và xài, không cần định nghĩa thêm. Nhưng trong 1 số trường hợp, ví dụ như bạn muốn viết 1 appender mới để sử dụng cho ServiceBus, hoặc gởi data lên EventHub thì lúc đó bạn phải viết 1 appender mới. Trong bài viết này, mình sẽ hướng dẫn các bạn viết 1 appender mới theo cách đơn giản nhất, xuất message ra file text. Từ ví dụ này, bạn có thể phát triển thêm nhiều appender tùy theo nhu cầu.

Hướng dẫn sử dụng Log4Net

Trong bài viết này, mình sẽ hướng dẫn cho các bạn cách sử dụng Log4Net đơn giản. Đây là 1 công cụ log khá mạnh, cho phép bạn cấu hình thật đơn giản trong app.config, với chế độ log messages. Ngoài ra, bạn có thể tùy biến và log message lên Azure chỉ với 1 vài dòng code.

Tìm hiểu về reflection trong .NET

Trong bài viết này, chúng ta sẽ đi qua 3 phần chính: Assembly, Reflection, và cách thực thi 1 phương thức trong reflection. Assembly Assembly là một thư viện gồm các đoạn code đã được dịch sẵn, do đó có thể chạy được bởi nhiều chương trình khác. Các chương trình khác chỉ cần bổ sung thư viện này và gọi các hàm trong thư viện, các hàm sẽ chạy ngay (do đã được dịch sẵn) mà không cần bộ dịch ngôn ngữ tương ứng và người viết chương trình cũng không cần tốn công viết lại các hàm đó nữa. Một vài Properties trong Assembly

Transform Web.config với Debug/Release on Build

Hôm trước mình build 1 web application trên VSTS, gặp trường hợp lỗi là web.config không tự động transform sang chế độ release. Cách khắc phục là mình thực hiện việc transform web.config trước khi build solution. Files trong project Tạo mới 1 dự án Web API 2. Bạn sẽ có 3 file web config: Web.config Web.Debug.config Web.Release.config Tạo file Web.Base.config. Copy toàn bộ nội dung từ Web.config => Web.Base.config. File Web.Base.config được dùng làm file gốc để thực hiện việc transform web config.

Sử dụng Token với Swagger UI (SwashBuckler)

Trong bài viết này, mình sẽ hướng dẫn các bạn thêm hàm đăng nhập (operation) /token và cách đính kèm token trong mỗi request từ Swagger. Nếu bạn chưa biết cách sử dụng Swagger, bạn tham khảo thêm bài viết: Thêm Swagger vào Web API Thêm 1 operation token vào document Mặc định hàm đăng nhập để lấy token sẽ không được hiển thị trong Swagger. Nếu muốn hiển thị hàm đăng nhập, bạn phải tùy chỉnh IDocumentFilter. Interface IDocumentFilter được định nghĩa như sau: public interface IDocumentFilter { void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer); }

Thêm Swagger vào Project Web API

ASP.NET Web API Help Page Khi tạo project Web API, sẽ có 1 nuget tên là Microsoft ASP.NET Web Api Help Page được cài đặt để tạo trang Help cho Web API.