昨天發現 Python3 有個 http.server 模組,能將包含 .html、.css、.js 的資料夾快速轉成靜態網站,遇到臨時性或簡單的測試需求,相當好用。

好巧不巧,馬上遇到類似的特殊需求:我有一批靜態網站檔案想請別人測試,若從本機開啟網頁時會觸發瀏覽器 Reason: CORS request not HTTP 錯誤,必須跑成網站才會正常。

【網頁豆知識】為何本機檔案會發生 CORS 錯誤 - Reason: CORS request not HTTP
Firefox、Chrome 等瀏覽器,基於安全將本機檔案視為 Opaque Origin (類似 DB null 的概念,具有無法比較的特性,即 null 與 null 也不會相等), 導致載入包含本機資源的本機檔案會觸發 CORS 錯誤。

如何讓非資訊相關使用者用最輕鬆的方法在 Windows 跑本機網站?安裝設定 IIS?裝 Python 敲指令?裝 Web Server for Chrome 套件

以上對純使用者來說都太複雜,我想到最簡單的方法是提供一個 .exe 放在靜態網站資料夾下,點兩下跑起來,打 X 關掉。既然昨天提到 ASP.NET Core Minimal API 用一行 app.UseFileServer() 就能搞定,今天就來驗證我是不是在吹牛。

dotnet new web 開個 Minimal API 專案,改一下 Program.cs:

using Microsoft.Extensions.FileProviders;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseFileServer(new FileServerOptions() {
    FileProvider = new PhysicalFileProvider(
        Directory.GetCurrentDirectory()
    ),
    RequestPath = "",
    EnableDirectoryBrowsing = false   
});

app.Run();

.csproj 加入 PublishSingleFile、RuntimeIdentifier、Configuration、PublishTrimmed 等發佈參數,以產出不需安裝 .NET 6 SDK,複製到 Windows x64 可直接執行的單一瘦身版 .exe 檔:(延伸閱讀:使用 dotnet 命令列工具發行 .NET 6 專案)

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <PublishSingleFile>true</PublishSingleFile>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <Configuration>Release</Configuration>
    <PublishTrimmed>true</PublishTrimmed>
    <ApplicationIcon>app.ico</ApplicationIcon>
  </PropertyGroup>

</Project>

如此,用指令 dotnet publish 會產生約 36MB 的 dnFileWeb.exe:

將 dnFileWeb.exe 跟 index.html, .png 放在一起,點兩下跳出熟悉的 ASP.NET Core Logger 視窗,開瀏覽器連上 http://localhost:5000 即可檢視網頁內容。

進階使用者若想綁定不同 IP 或不同 Port,則下指令 dnFileWeb --urls http://xxx.xxx.xxx.xx:8000 或使用環境變數設定,做法與 ASP.NET Core 完全相同。(參考:指定 ASP.NET Core Kestrel 接聽 Port)

就醬,我們輕輕鬆鬆便實現跟 Python http.server 一樣方便的功能,.NET 6 的成熟度與完整性真沒讓人失望,讚!

Tutorial of how to create a simple static web server with ASP.NET Core minimal API.


Comments

# by Lewis

強!

# by

# by Tim

這個也好用 https://www.rejetto.com/hfs/

# by Archana Agarwal

Amazing, an incredible grateful gesture to you. I admire how you present the <a href="https://eiliana.com/blogitem/how-good-it-is-to-become-an-android-developer"> best mobile app developers</a> with all the efforts to enlist them. It helped me develop the right skills and get the right approach. I was looking for some worthwhile freelance work, and I'm pretty impressed with Eiliana.com, which helped me get consistent projects.

# by 骨董修復菜鳥

請問大大: 我有個類似需求,但環境是.NET 4.7和3.5 有辦法達成嗎?

# by Jeffrey

to 骨董修復菜鳥,你是指自己寫程式做到嗎?可以試試 NancyFX https://blog.darkthread.net/blog/nancyfx/

# by 骨董修復菜鳥

黑大: 老闆的想法是:開發端沒裝NET CORE 6得情況下,希望像本篇包成一個單一執行檔,讓USER可以透過網芳直接執行,不要架網站

# by 骨董修復菜鳥

黑大: 老闆的想法是:開發端沒裝NET CORE 6得情況下,希望像本篇包成一個單一執行檔,讓USER可以透過網芳直接執行,不要架網站

# by Jeffrey

to 骨董修復菜鳥,.NET Core 可編譯成不依賴 .NET 6 SDK 的單一檔案(缺點是檔案較大,70MB 以上),丟到沒裝 .NET 6 SDK 的主機執行,指令為 ```dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true``` 細節可參考這篇:https://blog.darkthread.net/blog/dotnet6-publish-notes/

# by 骨董修復菜鳥

謝謝黑大

Post a comment