ASP.NET 核心中的 Server.MapPath 等价于什么?

我有这行代码,我想复制到我的控制器,但编译器抱怨

“服务器”名称在当前上下文中不存在

var UploadPath = Server.MapPath("~/App_Data/uploads")

如何在 ASP.NET 内核中实现等效?

115063 次浏览

更新: 不推荐使用 IHostingEnvironment。请参阅下面的更新。

在 Asp.NET Core 2.2及以下版本中,宿主环境使用接口 IHostingEnvironment进行了抽象

The ContentRootPath property will give you access to the absolute path to the application content files.

你也可以使用属性,WebRootPath,如果你想访问网络服务的根路径(默认情况下 www 文件夹)

您可以将此依赖项注入到控制器中,并按如下方式访问它:

public class HomeController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment;


public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}


public ActionResult Index()
{
string webRootPath = _hostingEnvironment.WebRootPath;
string contentRootPath = _hostingEnvironment.ContentRootPath;


return Content(webRootPath + "\n" + contentRootPath);
}
}

更新-. NET CORE 3.0及以上版本

IHostingEnvironment 已被标记为已过时。NET Core 3.0,正如@Amir133所指出的。您应该使用 IWebHostEnvironment而不是 IHostingEnvironment。请参考那个答案 下面

Microsoft 已将这些接口的宿主环境属性巧妙地隔离开来。请参考下面的接口定义:

namespace Microsoft.Extensions.Hosting
{
public interface IHostEnvironment
{
string EnvironmentName { get; set; }
string ApplicationName { get; set; }
string ContentRootPath { get; set; }
IFileProvider ContentRootFileProvider { get; set; }
}
}


namespace Microsoft.AspNetCore.Hosting
{
public interface IWebHostEnvironment : IHostEnvironment
{
string WebRootPath { get; set; }
IFileProvider WebRootFileProvider { get; set; }
}
}

.NET6(.NETCore3及以上版本)

例如,我想定位 ~/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();
}
}

一些技巧

另外,如果您没有控制器或服务,请遵循最后一部分并将其类注册为单例。 然后,在 Startup.ConfigureServices中:

services.AddSingleton<your_class_Name>();

最后,在需要的地方注入 your_class_Name


.NET Core 2

例如,我想定位 ~/wwwroot/CSS

public class YourController : Controller
{
private readonly IHostingEnvironment _HostEnvironment; //diference is here : IHostingEnvironment  vs I*Web*HostEnvironment


public YourController (IHostingEnvironment HostEnvironment)
{
_HostEnvironment= HostEnvironment;
}


public ActionResult Index()
{
string webRootPath = _HostEnvironment.WebRootPath;
string contentRootPath = _HostEnvironment.ContentRootPath;


string path ="";
path = Path.Combine(webRootPath , "CSS");
//or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
return View();
}
}

更多细节

感谢@Ashin,但是 IHostingEnvironment在 MVC Core 3中已经过时了! !

according to 这个 :

过时类型(警告) :

Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName

新型号:

Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments

因此必须使用 IWebHostEnvironment而不是 IHostingEnvironment

例如: var fullPath = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");

接受的答案的建议在大多数情况下是足够好的,但是-因为它取决于 依赖注入-是有限的控制器和视图: 为了有一个适当的 Server.MapPath替换,可以从非单例助手类访问,我们可以添加以下行(s)的代码在应用程序的 Startup.cs文件的 Configure()方法的结尾:

// setup app's root folders
AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath);
AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);

通过这种方式,我们可以通过以下方式从任何类(包括但不限于控制器和视图)中检索它们:

var contentRootPath = (string)AppDomain.CurrentDomain.GetData("ContentRootPath");
var webRootPath = (string)AppDomain.CurrentDomain.GetData("WebRootPath");

我们可以进一步利用这一点来创建一个静态助手方法,它允许我们拥有与旧的 Server.MapPath相同的功能:

public static class MyServer
{
public static string MapPath(string path)
{
return Path.Combine(
(string)AppDomain.CurrentDomain.GetData("ContentRootPath"),
path);
}
}

它可以用于以下方面:

var docPath = MyServer.MapPath("App_Data/docs");

关于这种方法的更多信息和一点背景知识,请看看我博客上的 这篇文章