Asp.net-Core
ASP.NET Core 3.0 HttpContext.Current.Server.MapPath
我將一個經典
C# MVC項目遷移到.NET Core並且我有一個實用程序項目,我需要在其中訪問App_Data文件夾。我已經在這個新項目中創建了我
App_Data在外面的文件夾,wwwroot但我需要從這個實用項目中獲取對它的引用。這是我的舊程式碼:
public static class Common { private static void DeleteTestFiles() { var path = HttpContext.Current.Server.MapPath("~/App_Data/Files"); ..... } }我正在閱讀 3.0 中有一種方法可以做到這一點,這裡是範例:
private readonly IWebHostEnvironment _hostingEnvironment; public HomeController(IWebHostEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; } public ActionResult Index() { string webRootPath = _hostingEnvironment.WebRootPath; string contentRootPath = _hostingEnvironment.ContentRootPath; return Content(webRootPath + "\n" + contentRootPath); }但是上面的程式碼是針對一個存在於 web 項目中的控制器。我的實用程序項目公共類不是控制器,而是一個靜態類,所以我不能有建構子以便必須
IWebHostEnvironment自動注入。任何線索我如何才能獲得路徑,或者我可能需要手動注入 IWebHostEnvironment 但不知道。
.Net 6 (.NetCore 3 及以上) 例如我想定位 ~/wwwroot/CSS
public class YourController : Controller { private readonly IWebHostEnvironment _webHostEnvironment; public YourController (IWebHostEnvironment webHostEnvironment) { _webHostEnvironment= webHostEnvironment; } public IActionResult Index() { string webRootPath = _webHostEnvironment.WebRootPath; string contentRootPath = _webHostEnvironment.ContentRootPath; string path =""; path = Path.Combine(webRootPath , "CSS"); //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" ); return View(); } }
不要使用靜態類。您可以保留與您的課程類似的內容,並將其註冊為單例。
public class Common { private readonly IWebHostEnvironment _env; public Common(IWebHostEnvironment env) { _env = env; } private void DeleteTestFiles() { var path = Path.Combine(_env.ContentRootPath, "App_Data/Files"); ..... } }然後,在
Startup.ConfigureServices:services.AddSingleton<Common>();最後,在需要的地方注入
Common,而不僅僅是靜態引用類。這就是 DI 中的工作方式,靜態是不行的。更新:
為了使它工作,因為 Utility 項目是引用
Microsoft.NETCore.App而不是Microsoft.AspNetCore.App框架,所以你必須使用IHostEnvironment而不是IWebHostEnvironment.
IWebHostEnvironment實際上實現了IHostEnvironment介面。做了測試,一切正常!我可以得到
ContentRootPath.public class Common { private readonly IHostEnvironment _env; public Common(IHostEnvironment env) { _env = env; } private void DeleteTestFiles() { var path = Path.Combine(_env.ContentRootPath, "App_Data/Files"); ..... } }
