2015-06-04 2 views
8

Ich möchte auf meine create.sql Datei im Hauptordner meines Servers zugreifen. Es enthält Abfragen zum Einrichten meiner Datenbank. Ich habe ein Problem, auf diese Datei überhaupt zuzugreifen.Lesen einer Datei in MVC 6

1) Ich kann nicht wirklich durch Configuration dorthin gelangen. Ich kann nur AddJsonFile, AddXmlFile und verwenden. Und ich denke, das ist nicht die beste Idee, um eine große SQL-Datei in eine von denen zu bringen.

2) Mvc source on github scheint zu fehlen MapPath. Also keine Möglichkeit, Server.MapPath("~/create.sql") zu verwenden.

Wie erreichen Sie das dann?

+0

'MapPath' ist Teil von ASP.NET. –

+3

Sie können die ApplicationBasePath-Eigenschaft im IApplicationEnvironment-Dienst verwenden, um den Stammpfad Ihrer Anwendung abzurufen ... neugierig, welches Szenario möchten Sie erreichen? –

+0

@KiranChalla Es funktioniert, wunderbar, danke! Wenn Sie es wünschen, schreiben Sie es bitte als Antwort und ich werde es akzeptieren :) Und bezüglich Ihrer Frage - Ich möchte die Struktur meiner Datenbank (Tabellen, Funktionen, etc.) auf einem Server-Startup aufbauen. –

Antwort

15

Wie bereits bemerkt und in den Kommentaren erwähnt, scheint es, dass es keine MapPath in ASP.NET VNext (MVC 6) gibt. Ich fand die Abhilfe hier:

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

Grundsätzlich müssen Sie die ApplicationBasePath von IApplicationEnvironment Schnittstelle erhalten, die zur Zeit als Dienst implementiert wird, unter der Lösung folgende:

private readonly IApplicationEnvironment _appEnvironment; 

    public HomeController(IApplicationEnvironment appEnvironment) 
    { 
     _appEnvironment = appEnvironment; 
    } 

    public IActionResult Index() 
    { 
     var rootPath = _appEnvironment.ApplicationBasePath; 
     return View(); 
    } 
4

Und auch, statt von der Einspritzung IApplicationEnvironment können Sie PlatformServices.Default.Application.ApplicationBasePath verwenden.

EDIT: Hier ist eine mögliche Implementierung von MapPath/UnmapPath als Erweiterungen PlatformServices:

removed (see EDIT2) 

EDIT2: Leicht modifizierte, IsPathMapped() sowie einige Kontrollen hinzugefügt, um zu sehen, ob der Pfad Kartierungs-/unmapping ist wirklich benötigt.

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() Rückkehr der tatsächliche Ausführungspfad und in .net Kern 2.0, DEBUG-Modus es xxx \ bin \ Debug \ netcoreapp2.0 ist, die offensichtlich nicht das, was erforderlich ist. Ersetzen Sie stattdessen PlatformServices durch IHostingEnvironment und verwenden Sie environment.WebRootPath.