Asp.net-Core

ASP.NET Core 3.0 HttpContext.Current.Server.MapPath

  • April 12, 2022

我將一個經典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");
               .....
       }
   }

引用自:https://stackoverflow.com/questions/59739688