︿
Top

2024年4月20日 星期六

ASP.NET Core 8 Web API 使用 Oracle.EntityFrameworkCore 存取 Oracle, 並使用 Swagger/OpenAPI 工具進行測試

Access Oracle with Oracle.EntityFrameworkCore in ASP.NET Core 8 Web API, and Test by Swagger/OpenAPI Tools

由於工作上會用到 ASP.NET Core 8 Web API 存取 Oracle 資料庫. 目前查到的方式有 2 種:
1.. 利用 Dapper 作為中介, 直接下 SQL 指令.
2.. 利用 Entity Framework Core 作為中介, 由其將 Entity Framework 的物件內容, 轉為 SQL 指令.

筆者已習慣採用 Entity Framework Core + MSSQL, 所以這篇就來試試 Entity Framework Core + Oracle.

撰寫完成的 Web API 總是要測試, 本文採用 Swagger/OpenAPI 的相關套件及工具, 進行測試.

內容大綱如下:

一. 環境
二. 步驟
(一) 安裝 dotnet-ef 命令列工具 至最新版
(二) 建立 Web API 專案
(三) 加入 Microsoft.EntityFrameworkCore.Tools 套件
(四) 加入 Oracle.EntityFrameworkCore 套件
(五) 建立 Oracle 資料庫, 使用者及 Table
(六) 由 Oracle 資料庫產生 DbContext 及 Models
(七) 撰寫 Web API
(八) 將程式進行優化
(九) 利用 Swashbuckle.AspNetCore 套件產生 Web API 的說明頁面
(十) 利用 NSwag.AspNetCore 套件產生 Web API 的說明頁面
(十一) 利用 NSwagStudio 工具產生用戶端的程式碼
附錄一: Oracle.EntityFranewrokCore 安裝後的提示
附錄二: EF Core Power Tools 執行完成的提示

範例由此下載.

2024年4月6日 星期六

如何在使用者登入後, 自動執行含有 ASP.NET Core 8 Web API 的 Windows Form 應用程式 (含TrayIcon)

How to Auto-Execute Windows Form App (TrayIcon) containing ASP.NET Core 8 Web API after User Login

前一篇把背景服務整合至使用者登入後的 TrayIcon 應用程式, 且確認可在使用者登入後執行. 而 ASP.NET Core 8 Web API 其實也類似一個背景服務, 想說看看是否可以作到.

試想一個情境:
想在瀏覽器的 Javascript 存取使用者的本機資源, 例如: 讀卡機, 描描器, 印表機, 本機環境設定... 等, 受限瀏覽器安全性設計, 應該很難作到. 或許可以, 但筆者不是 Javascript 專家, 想說是否有其它的路可以走. 看到 (黑暗執行緒) 使用 .NET 6 開發 Windows Service 有人詢問瀏覽器存取本機資源的問題, 黑大回覆可以參考這篇 (Microsoft) 在 Windows 服務上裝載 ASP.NET Core.

架構設計如下圖, 但不是真的去讀 ICCard, 只是作一個小的 Web API 驗證可行性.
Architecture for ICCard

筆者的狀況是不一定要裝載在 Windows Service, 只要是登入後執行的 Windows Form App, 且自動縮小到系統匣(System Tray) 即可.

一. 建立 ASP.NET Core 8 Web API 應用程式
(一) 建立 ASP.NET Core 8 Web API 專案
(二) 加入範例 Web API
(三) 採用 Serilog 輸出至 Console 及 File
二. 發佈前述 ASP.NET Core 8 Web API 至單一執行檔
(一) 以 VS2022 進行發佈
(二) 以 Postman 測試發佈後的執行檔
三. 加入 TrayIcon 的功能
(一) 加入 icon 圖檔
(二) 建立一個 Windows Form App 作為修訂 Web API 專案的參考
(三) 修改 .csproj
(四) 修訂其它程式
四. 實際測試
(一) TrayIcon 模式
(二) Console 模式
五. 安全性議題
(一) AllowHosts 設置
(二) CORS 設置
(三) 調整後的 Program.cs
六. 注意事項

範例由此下載.

2024年3月29日 星期五

如何在 .NET 8 建立基於 BackgroundService 的 Windows Service 應用程式 (2)

How to create Windows Service Application in .NET 8 by BackgroundService (2)

接續前一篇 "如何在 .NET 8 建立基於 BackgroundService 的 Windows Service 應用程式 (1)" 的內容.
思考以下情境, 如果該程式是在使用者登入時, 以 Console 模式執行, 那麼在 Windows 10 的工作列上, 是否就很容易被使用者看到, 而去把它關掉. 過程可參考 [附錄一].

因此, 筆者想到以前在 Windows Form 有一個叫作 TrayIcon 或 NotifyIcon 元件或類別, 可以將應用程式以圖示的方式, 存放在工作列(Task Bar) 的通知區(Notification Area) 或系統匣(System Tray).

本文將以前述程式碼為基礎, 添加 NotifyIcon 的功能, 以使整個程式, 得以同時支援 TrayIcon / Console / Windows Service 的使用方式.

一. 開發過程
二. 發行為單一執行檔
三. 以 TrayIcon 模式執行
四. 以 Console 模式執行
五. 以 Windows Service 模式執行
附錄一: 將 JokeWorkerService 放在登入時執行

範例由此下載.

如何在 .NET 8 建立基於 BackgroundService 的 Windows Service 應用程式 (1)

How to create Windows Service Application in .NET 8 by BackgroundService (1)

這是一個參考 (Microsoft)(中文版) 使用 BackgroundService 建立 Windows 服務 所作的演練.

如同 (黑暗執行緒) 使用 .NET 6 開發 Windows Service 所提到的, 可以同時支援 Console 及 Service 這 2 種執行模式真的很不錯. 不然以往都要切 3 個 C# 專案: 核心 Library, Console, Windows Service.

  • Library: 程式邏輯核心.
  • Console: 是為了偵錯用.
  • Windows Service: 是為了部署上線用.

以下為章節列表.

一. 開發過程
二. 採用 Serilog 輸出至 Console 及 File
三. 以 Console 模式執行
四. 以 Windows Service 模式執行

範例由此下載.

2024年3月24日 星期日

Oracle 的容器資料庫(CDB) 與 可拔插資料庫(PDB)

The Oracle Container DB (CDB) and Pluggable (PDB)

前言

由於最近工作上會用到 Oracle, 想說以前用過 11g, 應該很容易入門才對; 但發現在第一關的建立使用者就踼到鐵板, 如下面指令及輸出結果.

CREATE USER JASPER IDENTIFIED BY Test1234;

-- 執行結果:
-- ORA-65096: common user or role name must start with prefix C##

查了一下, 才發現自 Oracle 12c 起導入了所謂的 Multitenant Environment 多租用戶環境觀念, 允許一個 Container Database (CDB) 承載多個 Pluggable Database (PDB).

章節如下:

一. 建立一個 Oracle 23c Free 的 Docker Container
二. 以 11g 的方式, 建立使用者失敗
三. 連入 CDB, 建立 Common User Account
四. 連入 PDB, 建立屬於該 PDB 的 Local User Account
五. 以前述建立的 Local User Account, 建立 Table

2024年3月23日 星期六

如何在 ASP.NET Core 8 MVC 應用程式使用 Serilog

How to use Serilog in ASP.NET Core 8 MVC application

前言

筆者在前兩篇有針對 "ASP.NET MVC 及 ASP.NET Core MVC 的錯誤處理" 作了描述. 對於錯誤處理(Error Handling) 作了以下定義: 係指錯誤取得 (Catch), 訊息規格 (Specification), 呈現 (Presentation), 及記錄 (Logging).

前兩篇涵蓋了 "錯誤取得" 及 "訊息規格", 尚餘 "呈現" 及 "記錄".

呈現 (Presentation):

需視需求而定. 由於對前端不是很專長, 這裡就先藏拙不表.

記錄 (Logging):

本文主要著重於此. 由於很多人推薦 Serilog, 所以, 就以此作為演練的對象. 一般而言, 記錄會包含以下幾個面向:

  • 記錄的層級 (Log Level).
    各個 Log 套件都有其 Log Level 的定義, 但大同小異.
  • 記錄的目標或提供者 (Log Target / Log Provider / Log Sinks).
    例如: Console, File, MSSQL, Seq. 前3者很明確, 不作贅述. 至於 Seq 則是一個集中的 Logging 服務 , 它提供了 Web UI 介面, 可以讓開發人員系統管理人員操作, 進行記錄的查詢.
  • 記錄的內容 (Log Content): 需視需求而定.

本文將以前述 "ASP.NET Core MVC Error Handling 摘要版" 的程式為基底, 繼續往下增修內容.

章節內容如下:

一. 內建 Logger 的功能
二. 加入 Serilog 相關套件
三. 輸出至 Console 及 File 入門
四. 利用 UseSerilogRequestLogging middleware 記錄 Http Request 內容
五. 自訂輸出格式
六. 輸出至 Seq Logging 服務入門
七. 輸出至 MSSQL 資料庫入門
   (一) 套件安裝
   (二) 由 Serilog.Sinks.MSSqlServer 決定預設的欄位及資料型態 (by appsettings.json)
   (三) Serilog.Sinks.MSSqlServer 欄位種類概述
   (四) 自訂 Serilog.Sinks.MSSqlServer 的欄位及資料型態 (by Program.cs)
   (五) 自訂 Serilog.Sinks.MSSqlServer 的欄位及資料型態 (for ProblemDetails by Program.cs)
   (六) 改用自定義的統一輸出格式 (MyProblemDetails)
   (七) 建立一層 LoggingService 打包 ILogger, 以利寫入資料庫欄位
八. 關於 Serilog 的增強器 (Enrichers)

範例存放於 GitHub, 有興趣的朋友, 可自行下載參考.