ASP.NET Core Windows部署使用IIS托管 服務注冊Consul時的坑


大家習慣將服務注冊寫進Startup中的Configure管道配置,用來在服務啟動時進行Consul服務注冊,如圖:

 

然后將服務部署在IIS下,部署好之后,點擊啟動網站,卻發現服務並沒有注冊進Consul,然后我就查其原因:

 

 

 

 也就是說,使用IIS托管時,不管是進程內外托管,都會有這個問題,第一個請求時,應用才會運行起來,我用Exceptionless做了實測(進程外托管程序是dotnet),驗證后無疑。

 

 解決方案:

(1)使用IIS預加載,來自動觸發第一個請求達到服務注冊的目的(或每次部署完手動瀏覽或其他請求模擬器來達到啟動IIS工作進程的目的)。

  *先打開windows的應用初始化功能,很重要,因為不打開也能配置預加載,只是不會生效,笑哭(WIN10為例)

  1、打開“開啟和關閉Windows”功能

  2、點擊internet information services
  3、點擊“萬維網服務”
  4、點擊“應用程序開發功能”
  5、勾選“應用程序初始化”

  *IIS的配置(我直接截圖)

  1.更改網站對應的應用程序池的啟動模式

  

 

  2.網站啟用預加載

  

 

  3.配置預加載請求

  

 

  注意:預加載解決了注冊問題,但是帶來了新問題:網站停止時再次觸發了預加載,導致consul中注冊了一個不可用的服務。

     解決:先停網站的應用程序池再停網站可避免這個錯誤注冊的問題。

(2)不使用IIS托管需要注冊的服務,換成Windowss Service(可以考慮混合部署,IIS部署一些,Windowss Service部署一些),還有控制台或Windows Docker(選用自己合適的)

  asp.net core真是很方便,只需要引入Microsoft.Extensions.Hosting.WindowsServices包(官方文檔包引入有誤),然后UseWindowsService。發布后使用命令安裝成Windows Service就好了

  注意:Directory.GetCurrentDirectory()要換成AppContext.BaseDirectory或IHostEnvironment.ContentRootPath,解決宿主Windows Service獲取目錄問題

   

哈哈,一個小問題就牽扯出了IIS工作機制和asp.net core的工作機制

文檔:

使用 IIS 在 Windows 上托管 ASP.NET Core

在 Windows 服務中托管 ASP.NET Core

Windows 進程激活服務 (WAS)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM