ASP.NET Core應用程式現在是一個控制台應用程式,在Windows上直接雙擊啟動,但如果想讓開發完成的ASP.NET Core應用程式開機啟動,可以將ASP.NET Core應用程式修改成Windows服務運行,但這需要額外添加代碼,也可以使用IIS來托管ASP.NET Core應用程式,但 ...
ASP.NET Core應用程式現在是一個控制台應用程式,在Windows上直接雙擊啟動,但如果想讓開發完成的ASP.NET Core應用程式開機啟動,可以將ASP.NET Core應用程式修改成Windows服務運行,但這需要額外添加代碼,也可以使用IIS來托管ASP.NET Core應用程式,但可能需要安裝一些支持IIS的組件,第三個方式就是用Windows任務計劃來設置開機啟動。
但是,當一個ASP.NET Core應用程式直接使用Windows任務計劃啟動的時候,ASP.NET Core應用程式無法正確讀取到應用程式的配置文件從而導致程式運行出錯,問題的原因在於任務計劃執行的當前工作目錄不是ASP.NET Core應用程式所在目錄,而直接在ASP.NET Core應用程式裡面設置當前工作目錄是無效的,應用程式啟動之前配置文件的目錄可能就已經確定了,例如下麵的代碼:
var app = builder.Build(); app.UseStaticFiles(); //其它代碼略... string basePath1 = AppContext.BaseDirectory; Environment.CurrentDirectory = basePath1; Console.WriteLine("Set Current Work Directory:{0}", Directory.GetCurrentDirectory()); app.Run();
上面在ASP.NET Core應用程式裡面設置當前工作目錄是無效的,代碼環境為 ASP.NET Core WebAPI,.NET 6.0
解決這個問題是使用另外一個應用程式修改當前環境工作目錄為ASP.NET Core應用程式所在目錄即可,假設這個應用程式名字是Start,用任務計劃啟動Start.exe,而ASP.NET Core應用程式路徑作為Start的命令行參數即可,完整代碼如下:
namespace Start { internal class Program { static void Main(string[] args) { string basePath1 = AppContext.BaseDirectory; Environment.CurrentDirectory = basePath1; Console.WriteLine("Set Current Work Directory:{0}", Directory.GetCurrentDirectory()); if (args.Length == 0) { Console.WriteLine("no command line args,example:\r\n Start.exe exe_file_path"); System.Threading.Thread.Sleep(3000); return; } string path= args[0]; if (System.IO.File.Exists(path)) { string? path2= Path.GetDirectoryName(path); if (!string.IsNullOrEmpty(path2)) { Environment.CurrentDirectory = path2; Console.WriteLine("Set Current Work Directory:{0}", Directory.GetCurrentDirectory()); } Console.WriteLine("start programe : {0}", path); System.Diagnostics.Process.Start(path); } else { Console.WriteLine("file not exists:{0}", path); } System.Threading.Thread.Sleep(3000); } } }
之後,在任務計劃裡面如下圖進行配置,即可順利的在系統啟動就運行ASP.NET Core應用程式了。
圖1:添加一個系統啟動執行任務的任務計劃
圖2:任務計劃啟動start.exe,然後啟動ASP.NET Core應用程式。
《SOD框架“企業級”應用數據架構實戰》