ASP.NET Core中的Server.MapPath相当于什么?

时间:2018-03-21 05:41:19

标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我想在我的控制器中复制一些代码中的这一行,但编译器抱怨

  

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

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

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

4 个答案:

答案 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