ASP.NET 核心 3.0 HttpContext.Current.Server.MapPath
ASP.NET Core 3.0 HttpContext.Current.Server.MapPath
我正在将一个 classic C# MVC
项目迁移到 .NET Core
,我有一个实用程序项目,我需要在其中访问 App_Data
文件夹。
我已经在这个新项目中在 wwwroot
之外创建了我的 App_Data
文件夹,但我需要从这个实用程序项目中获取对它的引用。
这是我的旧代码:
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 项目中的控制器。我的 Utility Projects common class 不是 Controller,而是静态的 class,因此我无法使用构造函数来自动注入 IWebHostEnvironment
。
Any clue how can I do get the path or maybe I need to manually inject IWebHostEnvironment but don't have a clue.
不要使用静态 class。您可以保留与您的 class 类似的内容,并将其注册为单例。
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
,而不是仅仅静态引用 class。这就是 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");
.....
}
}
.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();
}
}
我正在将一个 classic C# MVC
项目迁移到 .NET Core
,我有一个实用程序项目,我需要在其中访问 App_Data
文件夹。
我已经在这个新项目中在 wwwroot
之外创建了我的 App_Data
文件夹,但我需要从这个实用程序项目中获取对它的引用。
这是我的旧代码:
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 项目中的控制器。我的 Utility Projects common class 不是 Controller,而是静态的 class,因此我无法使用构造函数来自动注入 IWebHostEnvironment
。
Any clue how can I do get the path or maybe I need to manually inject IWebHostEnvironment but don't have a clue.
不要使用静态 class。您可以保留与您的 class 类似的内容,并将其注册为单例。
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
,而不是仅仅静态引用 class。这就是 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");
.....
}
}
.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();
}
}