wake-up-neo.com

Lösungsdatendateien lesen ASP.Net Core

Ich habe eine ASP.NET Core (1.0-rc1-final) MVC-Lösung und möchte eine einfache Textdatei innerhalb des Projekts speichern, die eine Liste von Zeichenfolgen enthält, die ich in ein Zeichenfolgenarray in meinem Controller eingelesen habe.

Wo soll ich diese Datei in meinem Projekt speichern und wie lese ich diese Dateien in meinen Controllern?

In ASP.net 4.x hätte ich das app_data Ordner und so etwas getan

string path = Server.MapPath("~/App_Data/File.txt");
string[] lines = System.IO.File.ReadAllLines(path);

Aber Server.MapPath scheint in ASP.Net Core 1 nicht gültig zu sein, und ich bin mir nicht sicher, ob das app_data Ordner ist entweder.

29
Martin Kearn

Ich habe eine einfache Lösung dafür gefunden.

Erstens können Sie einen Ordner an einer beliebigen Stelle in Ihrer Lösung erstellen. Sie müssen sich nicht an die Konventionen wie 'app_data' aus .net 4.x halten.

In meinem Szenario habe ich einen Ordner namens 'data' im Stammverzeichnis meines Projekts erstellt, meine txt-Datei dort abgelegt und diesen Code verwendet, um den Inhalt in ein String-Array zu lesen

var owners = System.IO.File.ReadAllLines(@"..\data\Owners.txt");

26
Martin Kearn

in Ihrem Controller könnten Sie eine Abhängigkeit von IApplicationEnvironment haben und diese in den Konstruktor einfügen lassen. Anschließend können Sie damit den Pfad zu Ihrer Datei festlegen, sodass Ihre Datei in einem Ordner innerhalb des Projekts gespeichert werden kann. Im folgenden Beispiel ist "env" die Instanz von IApplicationEnvironment

using Microsoft.Extensions.PlatformAbstractions;

var pathToFile = env.ApplicationBasePath 
   + Path.DirectorySeparatorChar.ToString() 
   + "yourfolder"
   + Path.DirectorySeparatorChar.ToString() 
   + "yourfilename.txt";

string fileContent;

using (StreamReader reader = File.OpenText(pathToFile))
{
    fileContent = reader.ReadToEnd();
}

ApplicationBasePath repräsentiert den applicationRootFolder

beachten Sie, dass es auch IHostingEnvironment gibt, das über die bekannte .MapPath-Methode verfügt, diese jedoch für Objekte, die unterhalb des Ordners wwwroot gespeichert sind. Sie sollten Dinge nur unterhalb des Ordners wwwroot speichern, den Sie mit http-Anfragen bedienen möchten, damit es besser ist, die Liste der Zeichenfolgen in einem anderen Ordner zu speichern.

12
Joe Audette

Sie können die Umgebung mit Dependency Injection in Ihrem Controller abrufen:

using Microsoft.AspNetCore.Hosting;
....

public class HomeController: Controller
{
   private IHostingEnvironment _env;

   public HomeController(IHostingEnvironment env)
   {
   _env = env;
   }   
...

Dann können Sie den wwwroot-Speicherort in Ihren Aktionen abrufen: _env.WebRootPath

var owners =   System.IO.File.ReadAllLines(System.IO.Path.Combine(_env.WebRootPath,"File.txt"));
10

IApplicationEnvironment und IRuntimeEnvironment wurden per Ankündigung auf Github am 26.04.2016 entfernt.

Ich habe den Code von @ JoeAudette durch diesen ersetzt

private readonly string pathToFile;

public UsersController(IHostingEnvironment env)
{
    pathToFile = env.ContentRootPath
       + Path.DirectorySeparatorChar.ToString()
       + "Data"
       + Path.DirectorySeparatorChar.ToString()
       + "users.json";
}

Wo mein .json Datei befindet sich bei src/WebApplication/Data/users.json

Ich habe diese Daten dann so gelesen/analysiert

private async Task<IEnumerable<User>> GetDataSet()
{
    string source = "";

    using (StreamReader SourceReader = OpenText(pathToFile))
    {
        source = await SourceReader.ReadToEndAsync();
    }

    return await Task.FromResult(JsonConvert.DeserializeObject<IEnumerable<User>>(source)));
}
7
seangwright

Dies hat immer für mich vor Ort und auf IIS gearbeitet.

AppDomain.CurrentDomain.BaseDirectory

Um auf Ihre Datei zuzugreifen, können Sie einfach Folgendes tun:

import System.IO
...
var owners = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "File.txt"))
3
zdub

Diese Methode hat bei mir vor Ort und in der Azure-Umgebung funktioniert. Es ist aus Joes Antwort oben entnommen

public static string ReadFile(string FileName)
    {
        try
        {
            using (StreamReader reader = File.OpenText(FileName))
            {
                string fileContent = reader.ReadToEnd();
                if (fileContent != null && fileContent != "")
                {
                    return fileContent;
                }
            }
        }
        catch (Exception ex)
        {
            //Log
            throw ex;
        }
        return null;
    }

Und so wird diese Methode aufgerufen

string emailContent = ReadFile("./wwwroot/EmailTemplates/UpdateDetails.html");
3
Crennotech