大家習慣將服務注冊寫進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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/33264.html
標籤:.NET Core
