dotnet6 Text.Json範例

目的 不使用Newtonsoft.Json,改採.net6內建的System.Text.Json System.Text.Json更著重在效能與安全性,大多數人應該都跟我一樣只會使用基本的序列化及反序列化。 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 編輯WeatherForecastController檔案 將預設的API註解,寫入新的Action,預設不會引用System.Text.Json,記得在最上面using /// <summary> /// 序列化 /// </summary> /// <returns></returns> [HttpGet("JsonSerialize")] public ActionResult JsonSerialize() { var Test = new TestClass() { Name = "中文名", Age = 18 }; var Result = JsonSerializer.Serialize(Test); return Ok(Result); } /// <summary> /// 反序列化 /// </summary> /// <returns></returns> [HttpGet("JsonDeserialize")] public ActionResult JsonDeserialize() { var jsonString = @"{""Name"":""中文名"",""Age"":18}"; var Result = JsonSerializer.Deserialize<TestClass>(jsonString); return Ok(Result); } public class TestClass { public string Name { get; set; } public int Age { get; set; } } 執行結果 點選Try it out 點選Execute 查看執行結果1(序列化) 查看執行結果2(反序列化) 延伸問題 在不做任何設定的情況下,內建的序列化會有些微差異...

September 28, 2022

dotnet6 swagger授權

目的 在swagger內使用jwt token測試API 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 選擇.net6版本,支援OpenAPI支援一定要勾選,此選項.net5以後才會有,.net core 3.1並沒有此選項,需要從NuGet安裝,並點建立 專案基本設定 右邊紅框處專案檔點兩下,會開啟專案的xml檔案,額外加入兩行xml資料,目的是要透過編譯器產生文件檔案 <GenerateDocumentationFile>true</GenerateDocumentationFile> <NoWarn>$(NoWarn);1591</NoWarn> 加入前 加入後 編輯Program.cs檔案 修改program檔案內容,調整AddSwaggerGen的內容,目的是為了可以讀取我們所寫的註解 builder.Services.AddSwaggerGen(options => { // using System.Reflection; var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); }); 加入前 加入後 NuGet加入套件 透過NuGet安裝 JWT Microsoft.AspNetCore.Authentication.JwtBearer Microsoft.IdentityModel.Tokens System.IdentityModel.Tokens.Jwt 新增Helpers資料夾並在裡面新增JwtHelpers.cs類別檔案 jwt範例使用保哥範例來做修改,目的只是為了取得jwt token public class JwtHelper { private readonly JwtSettingsOptions _settings; public JwtHelper(IOptionsMonitor<JwtSettingsOptions> settings) { //注入appsetting的json _settings = settings.CurrentValue; } public string GenerateToken(string userName, int expireMinutes = 120) { //發行人 var issuer = _settings....

September 27, 2022

dotnet6 swagger範例

目的 每次要使用swaggerUI時候範例總是各式各樣,千奇百怪,下列範例是使用官方預設的Swashbuckle套件來教學。 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 選擇.net6版本,支援OpenAPI支援一定要勾選,此選項.net5以後才會有,.net core 3.1並沒有此選項,需要從NuGet安裝,並點建立 專案基本設定 右邊紅框處專案檔點兩下,會開啟專案的xml檔案,額外加入兩行xml資料,目的是要透過編譯器產生文件檔案 <GenerateDocumentationFile>true</GenerateDocumentationFile> <NoWarn>$(NoWarn);1591</NoWarn> 加入前 加入後 編輯Program.cs檔案 修改program檔案內容,調整AddSwaggerGen的內容,目的是為了可以讀取我們所寫的註解 program檔案與.net5以前不一樣,保哥的部落格有比較詳細的說明 builder.Services.AddSwaggerGen(options => { // using System.Reflection; var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); }); 加入前 加入後 編輯WeatherForecastController檔案 這裡有個重點,如果要增加下一個action時候,預設的範例檔案,需要調整route的設定,才能讀取到,不然會跳錯誤訊息 加入前 加入後 加入第二個方法 執行結果 就可以成功讀取到兩個方法了 參考 微軟官方 範例檔 GitHub

September 26, 2022

dotnet6 Telegram.Bot範例

目的 使用telegram做聊天機器人 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Telegram.Bot 編輯WeatherForecastController檔案 將預設的API註解 寫新的對外API [HttpGet("Test")] public async Task<string> Test() { var botClient = new TelegramBotClient("前置作業給的機器人ID"); //取得機器人基本資訊 var me = await botClient.GetMeAsync(); //發送訊息到指定頻道 Message message = await botClient.SendTextMessageAsync( chatId: "前置作業給的頻道ID", text: "Trying *all the parameters* of `sendMessage` method"); //回傳取得的機器人基本資訊 return $"Hello, World! I am user {me.Id} and my name is {me.FirstName}."; } 執行結果 F5執行後,依照下列步驟操作,並確認結果 就可以看到telegram的機器人有發送一個訊息 參考 官方文件 holey’s Blog...

September 25, 2022

dotnet6 Telegram.Bot前置作業

目的 在使用telegram機器人時,需要先在telegram新增要使用的機器人。 搜尋 搜尋@botfather 開始 點擊start 輸入/newbot指令 輸入/newbot指令後,對話欄會請你輸入你的名稱。 設定聊天機器人的顯示名稱 這邊所輸入的名稱,並沒有限制要Bot或_bot當結尾。 設定機器人帳號 其他人可以透過查詢帳號找到我們所建立的機器人。 當要輸入機器人帳號時,會限制要Bot或_bot結尾,需要特別注意。 取得token 如馬賽克處,是使用機器人時所要提供給api的token。 參考 官方文件

September 24, 2022

dotnet6 Bogus範例

目的 快速且簡單的製造假資料 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 其他資訊 直接進行下一步 NuGet加入套件 透過NuGet安裝 Bogus 編輯WeatherForecastController檔案 將預設的API註解 //除了using Bogus外,需注意需要using static Bogus.DataSets.Name,為了取得Gender using static Bogus.DataSets.Name; [HttpGet("Test")] public List<User> Test() { //可限制隨機值為定值 //Randomizer.Seed = new Random(8675307); //建立一個假的貨品陣列 var fruit = new[] { "apple", "banana", "orange", "strawberry", "kiwi" }; //預設訂單編號為0 var orderIds = 0; //預設取得英文資料 var testOrders = new Faker<Order>() //強制所有屬性都要有規則存在,預設為false .StrictMode(true) //OrderId is deterministic .RuleFor(o => o.OrderId, f => orderIds++) //從自訂陣列隨機取值 .RuleFor(o => o.Item, f => f....

September 23, 2022

dotnet6 Autofac範例

目的 批次註冊 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 新增類別檔 新增之後需要來描述要批次注入的規則 加入前 加入後 並且繼承autofac的類別Module 編輯Program.cs檔案 //初始化並建立一個實例 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); //註冊autofac這個容器 builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacModuleRegister())); 有繼承autofac的類別Module 新增資料夾 新增下圖兩個資料夾 新增類別檔 此次的目的是要可以進行批次注入,所以檔名結尾都需要包含Service,做批次注入時可以辨識 在Services資料夾底下加入類別檔案,名稱為TestService 在Interface資料夾底下加入介面檔案,名稱為ITest ITest.cs寫入程式 namespace AutoFacExample.Services.Interface { public interface ITest { public string GetName(string id); } } TestService.cs寫入程式 繼承介面後寫上與介面相同的方法 using AutoFacExample.Services.Interface; namespace AutoFacExample.Services { public class TestService : ITest { public string GetName(string id) { return $"{id}:Bill"; } } } AutofacModuleRegister執行批次註冊 protected override void Load(ContainerBuilder builder) { //RegisterAssemblyTypes => 註冊所有集合 //Where(t => t....

September 22, 2022

dotnet6 BenchmarkDotNet範例

目的 快速測試不同寫法的效能差異。 建立新專案 選擇主控台應用程式專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 下載BenchmarkDotNet套件與automapper套件,automapper為這次要測試效能的套件 Program寫入程式 此次要測試的項目為三種類別轉換的效能差異 using AutoMapper; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; //指定要測試的class var summary = BenchmarkRunner.Run<BenchmarkSampleAuto>(); //加入記憶體使用量測試 [MemoryDiagnoser] public class BenchmarkSampleAuto { private readonly List<DbModel> _data = new List<DbModel>(); private readonly IMapper _mapper; public BenchmarkSampleAuto() { //automapper設定 var config = new MapperConfiguration(cfg => { cfg.CreateMap<DbModel, ViewModel>(); }); _mapper = new Mapper(config); //準備一份List資料 PrepareTestObjects(); } private void PrepareTestObjects() { _data.Add(new DbModel() { Id = 1, Name = "Bill", Age = 18, CreatedDate = DateTime....

September 21, 2022

dotnet6 Automapper範例

目的 快速對應,不需要寫linq來將資料庫端的model對應到view要用的model 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 透過NuGet安裝AutoMapper.Extensions.Microsoft.DependencyInjection 編輯Program.cs檔案 註冊AutoMapper //找到所有繼承profile builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); 新增Mappings資料夾與Models資料夾 在Models資料夾內加入DbModel資料夾與ViewModel資料夾 加入類別檔 在兩個資料夾內加入同名稱的類別檔案 DbModel.cs寫入程式碼 public int Id { get; set; } public string? Name { get; set; } public int Age { get; set; } public DateTime CreatedDate { get; set; } 可能會有些人問?是什麼,這是因為建立.net6專案預設會開啟判斷值可能為null的警告訊息,可以加上?代表允許此屬性為null,會建議在建構子時提供預設值,來避免嘗試對null值做處理的exception。 ViewModel.cs寫入程式 public ViewModel() { Name = string.Empty; } public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } 在建構子提供預設值後,來避免對null做處理。...

September 20, 2022

dotnet6 MailKit範例

目的 使用gmail寄信 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Google.Apis.Auth(使用google信箱時需要做oauth驗證才可以使用) MailKit(寄信) 編輯WeatherForecastController檔案 將預設的API註解 [HttpGet("SendEmail")] public async Task<IActionResult> Get() { #region OAuth驗證 const string GMailAccount = "前置作業文章打上去的測試帳號"; var clientSecrets = new ClientSecrets { ClientId = "前置作業文章最後給的用戶ID", ClientSecret = "前置作業文章最後給的用戶端密碼" }; var codeFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { DataStore = new FileDataStore("CredentialCacheFolder", false), Scopes = new[] { "https://mail.google.com/" }, ClientSecrets = clientSecrets }); var codeReceiver = new LocalServerCodeReceiver(); var authCode = new AuthorizationCodeInstalledApp(codeFlow, codeReceiver); var credential = await authCode....

September 19, 2022