在MVC 6中读取文件

我想在我的服务器的主文件夹中访问我的create.sql文件。 它包含用于设置数据库的查询。 我有一个问题,根本无法访问此文件。

1)我无法通过Configuration 。 我只能使用AddJsonFileAddXmlFileAddIniFile 。 而且我认为将一个大的sql文件放入其中的任何一个都不是最好的主意。

2) github上的Mvc源似乎缺少MapPath 。 因此不可能使用Server.MapPath("~/create.sql")

那么如何实现呢?

正如已经注意到并在评论中提到的,似乎ASP.NET VNext(MVC 6)中没有MapPath 。 我找到了解决方法:

http://forums.asp.net/t/2005166.aspx?HostingEnvironment+Equivalent+For+MapPath

基本上,您需要从IApplicationEnvironment接口获取ApplicationBasePathIApplicationEnvironment接口当前是作为服务实现的,遵循以下解决方案:

  private readonly IApplicationEnvironment _appEnvironment; public HomeController(IApplicationEnvironment appEnvironment) { _appEnvironment = appEnvironment; } public IActionResult Index() { var rootPath = _appEnvironment.ApplicationBasePath; return View(); } 

而且,您可以使用PlatformServices.Default.Application.ApplicationBasePath而不是注入IApplicationEnvironment

编辑 :这是一个可能的MapPath / UnmapPath实现作为PlatformServices扩展:

 removed (see EDIT2) 

EDIT2 :稍加修改,添加了IsPathMapped()以及一些检查以确定是否真的需要路径映射/取消映射。

 public static class PlatformServicesExtensions { public static string MapPath(this PlatformServices services, string path) { var result = path ?? string.Empty; if (services.IsPathMapped(path) == false) { var wwwroot = services.WwwRoot(); if (result.StartsWith("~", StringComparison.Ordinal)) { result = result.Substring(1); } if (result.StartsWith("/", StringComparison.Ordinal)) { result = result.Substring(1); } result = Path.Combine(wwwroot, result.Replace('/', '\\')); } return result; } public static string UnmapPath(this PlatformServices services, string path) { var result = path ?? string.Empty; if (services.IsPathMapped(path)) { var wwwroot = services.WwwRoot(); result = result.Remove(0, wwwroot.Length); result = result.Replace('\\', '/'); var prefix = (result.StartsWith("/", StringComparison.Ordinal) ? "~" : "~/"); result = prefix + result; } return result; } public static bool IsPathMapped(this PlatformServices services, string path) { var result = path ?? string.Empty; return result.StartsWith(services.Application.ApplicationBasePath, StringComparison.Ordinal); } public static string WwwRoot(this PlatformServices services) { // todo: take it from project.json!!! var result = Path.Combine(services.Application.ApplicationBasePath, "wwwroot"); return result; } } 

EDIT3: PlatformServices.WwwRoot()返回实际的执行路径,在.net core 2.0中,DEBUG模式是xxx \ bin \ Debug \ netcoreapp2.0,这显然不是必需的。 而是将PlatformServices替换为IHostingEnvironment并使用environment.WebRootPath