2015-07-13 8 views
9

quando si distribuisce un'app di asp.net5/mvc6 c'è la cartella wwwroot in cui sono presenti risorse Web come css, js, le immagini e la cartella di approvazione in cui appartengono i pacchetti e il codice sorgente. Sembra che le classi nello spazio dei nomi Microsoft.Framework.Configuration, ad esempio, debbano essere in grado di leggere i file da sotto approot poiché è lì che vivono i file config.json.in asp.net 5 è possibile memorizzare e leggere file personalizzati in approot invece di wwwroot?

Quello che voglio sapere è, è possibile archiviare e leggere i file personalizzati dei miei propri in approot? e se sì, come?

Ad esempio, non sto utilizzando Entity Framework, quindi ho bisogno di un posto dove installare sql e aggiornare gli script e preferirei non metterli sotto wwwroot. Ho anche file di configurazione personalizzati per cose come la sitemap di navigazione che preferirei non mettere sotto wwwroot se è possibile inserirli altrove come l'approvazione.

so di poter accedere ai file sotto wwwroot utilizzando IHostingEnvironment env.MapPath ("~/somefileinwwwrootfoilder.json")

C'è un modo simile per accedere ai file sotto AppRoot?

risposta

7

Sì, è possibile. Basta avere il percorso della cartella app e il pass per la configurazione o chiunque altro ne ha bisogno:

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

in modo da ottenere il file percorso come string path = env.MapPath (appEnv.ApplicationBasePath + "/somefolder/somefile.json"); ? –

+1

Vedo, ApplicationBasePath è un percorso del file system non virtuale, quindi dobbiamo utilizzare appRoot + Path.DirectorySeparatorChar + foldername + Path.DirectorySeparatorChar + filename; per costruire il percorso in una piattaforma in modo neutro –

+1

Basta usare Path.Combine :) – davidfowl

6

La risposta accettata è corretta, ma dal momento che un ASP.NET core release 1.0 alcune cose sono cambiate così ho pensato Scriverò un po 'di cose chiare.

Quello che ho fatto è stato creare una cartella nel mio progetto chiamato AppData. Puoi chiamarlo come preferisci.

Nota: non è in wwwroot perché vogliamo mantenere questo privato di dati.

Successivamente, è possibile utilizzare IHostingEnvironment per accedere al percorso della cartella. Questa interfaccia può essere iniettata come una dipendenza in una sorta di servizio di supporto e che cosa si finisce con è qualcosa di simile:

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(); 
     } 
    } 
} 

Inoltre, per ottenere le cose di distribuire correttamente ho dovuto aggiungere la cartella AppData al publishOptions Lista include in project.json.

Come accennato nei commenti, per distribuire la cartella AppData correttamente in ASP.NET MVC Core 2 (usando *.csproj di file, invece di project.json), la sintassi è la seguente:

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

Come si fa ora che project.json è stato sostituito con .csproj.Ho provato a inserire un '' ma questo non ha copiato nulla nella cartella. –

+1

La stessa domanda qui. – arao6

+1

Capito: ' ' – arao6

Problemi correlati