前言
曾經在開發 Asp.Net 網站時就在想,為什么一定要把網站掛到 IIS 上?網站項目的 Main 函數哪兒去了?后來才知道這個 Main 函數在 w3wp.exe 里,這也是 IIS 的主進程。Asp.Net 網站的命門被 IIS 捏着,我無力改變。有時需要臨時搭建一個簡單的 Web 服務器,去網上一通度娘,發現了 MyWebServer、HFS (HTTP File Server) 等簡單實用的 Web 服務器,而且它們還是桌面應用。我就在想,什么時候能用 .Net 來開發一個桌面 Web 服務器。直到 .Net Core 3.0 誕生 ㄟ(≧◇≦)ㄏ
Asp.Net Core 網站本質上是一個控制台程序,使用 Microsoft.NET.Sdk.Web SDK 進行開發。Windows桌面應用是 .Net Core 3.0 新增的開發方式,使用 Microsoft.NET.Sdk.WindowsDesktop SDK 開發。本來一個項目只能使用一個SDK,再加上這兩種應用的特殊性,用 Microsoft.NET.Sdk 基礎 SDK(控制台應用的SDK)自行使用 Nuget 引入相關包來開發會導致各種問題。曾經試過網站應用,編譯后會導致Razor引擎異常,無法正常渲染視圖。但自從 Asp.Net Core 網站脫離 IIS 可以自寄宿運行,.Net Core 支持 Windows 桌面應用開發,我就夢想能把 Asp.Net Core 應用托管到 Windows 桌面程序。C/C++ 曾經的天下,大 .Net 也想分杯羹。
經過一段時間的摸索,夢想終於實現了。在此記錄隨筆紀念,同時也分享給廣大園友。
正文
廢話不多說,先說明如何運行項目。首先下載項目源代碼,注意是 NetCore_3.0 分支,地址:https://github.com/CoreDX9/IdentityServerDemo
確認VS 2019 16.4.0 以上版本,安裝 .Net Core 3.1 SDK。打開解決方案,卸載如圖所示的項目,避免生成失敗,都是些暫時沒用的東西。
修改代碼,具體如圖所示:
還原解決方案的 Nuget 包,還原 IdentityServer 的 npm 包。在 IdentityServer 和 IdentityServerGui 上右鍵,選擇發布, 其中 IdentityServer 使用 FolderProfileRelease 配置進行發布。如果沒有問題的話稍等片刻發布成功,到解決方案根目錄找到 .publish 文件夾,進去把 IdentityServerGui\release 文件夾中的所有東西復制粘貼到 IdentityServer\release 文件夾中,途中如果存在重名文件,請忽略大小時間都相同的文件,其他文件盡量選最新或最大的,除非你清楚哪個是你要的。推薦在 Win 10 下操作,或者用其他更智能的文件拷貝軟件。
到此,所有准備工作已經完成,進去找到 IdentityServerGui.exe 雙擊運行即可。
效果預覽
原理講解
桌面程序是一個 WPF 程序,本來是想簡單點用 Winform 來做的,結果 Winform 沒有設計器 (╯‵□′)╯︵┻━┻ 搞得我還現研究 WPF 怎么玩。關鍵在於, Asp.Net Core 網站實際上就是一個標准的 .Net 程序集,可以當作類庫來引用,這里搞清楚以后剩下的事就水到渠成了。在 WPF 項目的依賴項中添加引用 Asp.Net Core 網站項目,using 命名空間,調用在 Asp.Net Core 項目中准備好的公共方法獲取 IHost 接口對象,啟動就行。要注意 ContentRootPath 對不對,不然 css、js 會404。
嗯,原理就是這么簡單。。。來幾張截圖說明下關鍵部分吧 o(*////▽////*)q
一些注意點:
1、在網站運行中關閉主窗口會最小化到系統托盤圖標,雙擊圖標恢復窗口。網站未運行時就是正常退出程序。
2、發布的網站實際上也可以單獨運行,雙擊 IdentityServer.exe 就行。
3、關於Https配置,具體見下圖。
4、關於網站日志信息,重定向輸出流,具體看圖。
5、WPF 模型綁定需要實現的 INotifyPropertyChanged 接口代碼由 PropertyChanged.Fody 在編譯時注入。
6、注意跨線程調用UI控件的問題。
更新(2020-1-10):
請同時克隆 github 項目 https://github.com/CoreDX9/Harmonic/tree/dev ,在 IdentityServer 項目的依賴項中將 Harmonic(Harmonic.csproj )項目引用指向您下載的位置,否則會導致編譯失敗。
更新(2020-2-6):
項目簡介和運行方法已經寫入 GitHub 的 README.md 中,將來如有更新會直接更新到 GitHub 的說明文檔,此處不再更新。
轉載請完整保留以下內容,未經授權刪除以下內容進行轉載盜用的,保留追究法律責任的權利!
本文地址:https://www.cnblogs.com/coredx/p/12031514.html
完整源代碼:Github
里面有各種小東西,這只是其中之一,不嫌棄的話可以Star一下。