2015-07-13 2 views
9

, wenn Sie einen asp.net5/mvc6 App implementieren der Wwwroot-Ordner befindet sich in dem Web-Assets wie CSS, JS, Bilder gehören, und es gibt AppRoot Ordner, in dem Paket und Quellcode gehören. Es scheint, dass Klassen im Microsoft.Framework.Configuration Namespace zum Beispiel der Lage sein müssen Dateien von unten AppRoot zu lesen, da das ist, wo config.json Dateien leben würden.in asp.net 5 ist es möglich, benutzerdefinierte Dateien in approot statt wwwroot zu speichern und zu lesen?

Was will ich wissen, ist, ist es möglich, benutzerdefinierte Dateien meiner eigenen in AppRoot zu speichern und zu lesen? und wenn ja wie?

Zum Beispiel ich Entity Framework nicht so verwenden brauche ich einen Platz SQL installieren zu setzen und Skripte aktualisieren und würde es vorziehen, sie nicht unter wwwroot zu setzen. Ich habe auch benutzerdefinierte Konfigurationsdateien für Dinge wie Navigations-Sitemap, die ich lieber nicht unter wwwroot legen würde, wenn es möglich ist, sie woanders wie approot zu setzen.

Ich weiß, dass ich Dateien unter wwwroot zugreifen kann IHostingEnvironment env.MapPath mit ("~/somefileinwwwrootfoilder.json")

Gibt es eine ähnliche Art und Weise Dateien unter AppRoot zugreifen?

Antwort

7

Ja, ist es möglich. Nehmen Sie einfach den Pfad zu Ihrem App-Ordner und der Pass es zur Konfiguration oder wer sonst noch braucht es:

public class Startup 
{ 
    public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) 
    { 
     var wwwrootRoot = env.WebRootPath; 
     var appRoot = appEnv.ApplicationBasePath; 
+0

so erhalte ich die Datei Pfad wie Zeichenfolge Pfad = env.MapPath (appEnv.ApplicationBasePath + "/somefolder/somefile.json"); ? –

+1

Ich sehe, ApplicationBasePath ist ein Dateisystempfad nicht virtuell, also müssen wir appRoot + Path.DirectorySeparatorChar + Ordnername + Path.DirectorySeparatorChar + Dateiname; um den Pfad auf eine plattformneutrale Art und Weise zu erstellen –

+1

Einfach Path.Combine :) verwenden – davidfowl

6

Die akzeptierte Antwort richtig ist, aber seit einer ASP.NET Core-Version 1.0 ein paar Dinge haben sich geändert, so dachte ich, Ich würde ein neues klares Ding ein bisschen schreiben.

Was ich tat, war ein Ordner in meinem Projekt AppData genannt erstellen. Du kannst es so nennen, wie du willst.

Hinweis: es ist nicht in wwwroot weil wir diese Daten privat halten wollen.

Als nächstes können Sie IHostingEnvironment verwenden, um Zugriff auf den Ordnerpfad zu erhalten. Diese Schnittstelle kann als eine Abhängigkeit in eine Art Helferdienst injiziert werden und was man ist etwas am Ende wie folgt:

public class AppDataHelper 
{ 
    private readonly IHostingEnvironment _hostingEnvironment; 
    private const string _appDataFolder = "AppData"; 

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

    public async Task<string> ReadAllTextAsync(string relativePath) 
    { 
     var path = Path.Combine(_hostingEnvironment.ContentRootPath, _appDataFolder, relativePath); 

     using (var reader = File.OpenText(path)) 
     { 
      return await reader.ReadToEndAsync(); 
     } 
    } 
} 

Zusätzlich, um die Dinge richtig zu implementieren erhalte ich die AppData Ordner der publishOptions hinzufügen musste include Liste in project.json.

Wie in den Kommentaren erwähnt, AppData Ordner korrekt in ASP.NET MVC 2 Kern zu implementieren (mit *.csproj Datei, statt project.json), Syntax ist wie folgt:

<ItemGroup> 
    <None Include="AppData\*" CopyToPublishDirectory="PreserveNewest" /> 
    </ItemGroup> 
+1

Wie machen Sie es jetzt, dass project.json durch .csproj ersetzt wurde.Ich habe versucht, ein '' einzufügen, aber das hat nichts in den Ordner über kopiert. –

+1

Gleiche Frage hier. – arao6

+1

Es wurde herausgefunden: ' ' – arao6

Verwandte Themen