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"));