我想在我的控制器中复制一些代码中的这一行,但编译器抱怨
名称'服务器'在当前上下文中不存在
var UploadPath = Server.MapPath("~/App_Data/uploads")
如何在ASP.NET Core中实现等效?
答案 0 :(得分:28)
在Asp.NET Core中,托管环境已使用界面IHostingEnvironment
进行抽象ContentRootPath属性将允许您访问应用程序内容文件的绝对路径。
如果您想访问可通过网络访问的根路径(默认情况下为www文件夹),您也可以使用属性WebRootPath
您可以将此依赖项注入控制器并按如下方式访问它:
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);
}
}
<强>更新强>
如{@ 3}}所指出的,IHostingEnvironment已经被.NET Core 3.0标记为过时。如果目标框架是.NET Core 3.0,请使用IWebHostEnvironment,如下所示:
public class HomeController : Controller
{
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);
}
}
答案 1 :(得分:3)
感谢@ashin的回答,但是{。{1}}在.Net core 3中已经被淘汰!
根据this:
过时的类型(警告):
IHostingEnvironment
新类型:
Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName
因此,您必须使用IWebHostEnvironment而不是IHostingEnvironment。
Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments
答案 2 :(得分:1)
可接受的答案的建议在大多数情况下都足够好,但是-由于它取决于依赖注入-仅限于控制器和视图:为了进行适当的Server.MapPath
替换,可以从非单帮助类访问的代码,我们可以在应用程序Configure()
文件的Startup.cs
方法的末尾添加以下代码行:
// setup app's root folders
AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath);
AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);
这样,我们将可以通过以下方式从任何类(包括但不限于Controllers和Views)中检索它们:
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");
有关此方法的更多信息和背景知识,请查看我的博客上的this post。
答案 3 :(得分:0)
使用例如:dict