tag route nswag net data asp all c# asp.net-core asp.net-core-mvc asp.net-core-1.0

c# - route - Lea los archivos de datos de la solución ASP.Net Core



swashbuckle vs nswag (5)

Tengo una solución MVC ASP.NET Core (1.0-rc1-final) y deseo almacenar un archivo de texto simple dentro del proyecto que contenga una lista de cadenas que leo en una matriz de cadenas en mi controlador.

¿Dónde debería guardar este archivo en mi proyecto y cómo puedo leer esos archivos en mis controladores?

En ASP.net 4.x, habría utilizado la carpeta app_data y app_data hecho algo como esto

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

Pero Server.MapPath no parece ser válido en ASP.Net Core 1 y tampoco estoy seguro de que la carpeta app_data sea.


en su controlador puede tomar una dependencia de IApplicationEnvironment y hacer que se inyecte en el constructor, luego puede usarla para establecer la ruta de su archivo para que su archivo pueda vivir en una carpeta dentro del proyecto. En el siguiente ejemplo, "env" es la instancia de 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 representa la aplicaciónRootFolder

tenga en cuenta que también existe IHostingEnvironment que tiene el método familiar de .MapPath, pero es para cosas almacenadas debajo de la carpeta wwwroot. Solo debe almacenar cosas debajo de la carpeta wwwroot que desea publicar con solicitudes http por lo que es mejor mantener su lista de cadenas en una carpeta diferente.


Encontré una solución simple para esto.

En primer lugar, puede crear una carpeta en cualquier lugar de su solución, no tiene que apegarse a las convenciones como ''app_data'' de .net 4.x.

En mi caso, creé una carpeta llamada ''data'' en la raíz de mi proyecto, puse mi archivo txt allí y usé este código para leer los contenidos en una matriz de cadenas

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


IApplicationEnvironment e IRuntimeEnvironment se han eliminado a partir de un anuncio en github el 26/04/2016.

Reemplacé el código de @ JoeAudette con este

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

Donde mi archivo .json se encuentra en src/WebApplication/Data/users.json

Luego leo / analizo esta información como tal

private async Task<IEnumerable<User>> GetDataSet() { string source = ""; using (StreamReader SourceReader = OpenText(pathToFile)) { source = await SourceReader.ReadToEndAsync(); } return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<IEnumerable<User>>(source)); }


Este método me funcionó localmente y en el entorno de Azure. Se toma de la respuesta de Joe anterior

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

Y así es como se invoca ese método

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


Puede obtener el entorno con Dependency Injection en su controlador:

using Microsoft.AspNetCore.Hosting; .... public class HomeController: Controller { private IHostingEnvironment _env; public HomeController(IHostingEnvironment env) { _env = env; } ...

Luego puede obtener la ubicación de wwwroot en sus acciones: _env.WebRootPath

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