大家習慣將服務注冊寫進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的工作機制
文檔: