读取解决方案数据文件 ASP.Net Core
Posted
技术标签:
【中文标题】读取解决方案数据文件 ASP.Net Core【英文标题】:Read solution data files ASP.Net Core 【发布时间】:2016-03-07 11:29:17 【问题描述】:我有一个 ASP.NET Core (1.0-rc1-final) MVC 解决方案,我希望在项目中存储一个简单的文本文件,其中包含我读入控制器中的字符串数组的字符串列表。
我应该将该文件存储在我的项目中的什么位置,以及如何在我的控制器中读取这些文件?
在 ASP.net 4.x 中,我会使用 app_data
文件夹并完成类似的操作
string path = Server.MapPath("~/App_Data/File.txt");
string[] lines = System.IO.File.ReadAllLines(path);
但Server.MapPath
在 ASP.Net Core 1 中似乎无效,我也不确定 app_data
文件夹是否有效。
【问题讨论】:
【参考方案1】:我找到了一个简单的解决方案。
首先,您可以在解决方案的任何位置创建一个文件夹,您不必遵守 .net 4.x 中的“app_data”之类的约定。
在我的场景中,我在项目的根目录下创建了一个名为“data”的文件夹,我将我的 txt 文件放入其中并使用此代码将内容读取到字符串数组中
var owners = System.IO.File.ReadAllLines(@"..\data\Owners.txt");
【讨论】:
这在我的机器上对我不起作用,因为它跳过了项目文件夹。即:它需要是“D:\SOLUTION_FOLDER\PROJECT_FOLDER\data\Owners.txt”并尝试从“D:\SOLUTION_FOLDER\data\Owners.txt”中读取 您最好的选择是始终使用IHostingEnvironment 从 .NET Core 3.0 IHostingEnvironment 已过时,应替换为 IWebHostEnvironment【参考方案2】:您可以在控制器中通过依赖注入获得环境:
using Microsoft.AspNetCore.Hosting;
....
public class HomeController: Controller
private IHostingEnvironment _env;
public HomeController(IHostingEnvironment env)
_env = env;
...
然后您可以在操作中获取 wwwroot 位置: _env.WebRootPath
var owners = System.IO.File.ReadAllLines(System.IO.Path.Combine(_env.WebRootPath,"File.txt"));
【讨论】:
为什么 _env.WebRootPath 会为空? @Corpsekicker...您可能没有注册依赖项 现在 IHostingEnvironment 已过时,应替换为 IWebHostEnvironment【参考方案3】:在您的控制器中,您可以依赖 IApplicationEnvironment 并将其注入到构造函数中,然后您可以使用它来建立文件的路径,以便您的文件可以存在于项目中的文件夹中。在下面的示例中,“env”是 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 代表 applicationRootFolder
请注意,还有 IHostingEnvironment 具有熟悉的 .MapPath 方法,但它用于存储在 wwwroot 文件夹下的内容。您应该只将内容存储在您希望通过 http 请求提供服务的 wwwroot 文件夹下,因此最好将字符串列表保存在不同的文件夹中。
【讨论】:
感谢您的回复,但我找到了一个更简单的方法,我已发布并将标记为答案。不过谢谢 我给出了一个正确的答案,只是因为它不是您最终选择的确切语法,这不是不接受我的回答恕我直言的好理由。如果我没记错的话,你的答案也只会在 Windows 文件系统上是正确的。 好的,我明白你的观点,你的解决方案将是跨平台的,因此会更好 - 已经给了你答案,谢谢 1.看起来 IApplicationEnvironment 现在已经死了。 IHostingEnvironment 似乎已经取代了它。 2. Path.Combine() 将使这个解决方案更具吸引力:var pathToFile = System.IO.Path.Combine(env.ContentRootPath, "yourfolder", "yourfilename.txt");
【参考方案4】:
这在本地和 IIS 上一直对我有用。
AppDomain.CurrentDomain.BaseDirectory
要访问您的文件,您只需执行以下操作:
import System.IO
...
var owners = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "File.txt"))
【讨论】:
这也与我在使用 dotnet core 的 Raspberry Pi 上工作【参考方案5】:IApplicationEnvironment
和 IRuntimeEnvironment
已于 2016 年 4 月 26 日从 announcement on github 中删除。
我用这个替换了@JoeAudette 的代码
private readonly string pathToFile;
public UsersController(IHostingEnvironment env)
pathToFile = env.ContentRootPath
+ Path.DirectorySeparatorChar.ToString()
+ "Data"
+ Path.DirectorySeparatorChar.ToString()
+ "users.json";
我的.json
文件位于src/WebApplication/Data/users.json
然后我像这样读取/解析这些数据
private async Task<IEnumerable<User>> GetDataSet()
string source = "";
using (StreamReader SourceReader = File.OpenText(pathToFile))
source = await SourceReader.ReadToEndAsync();
return await Task.FromResult(JsonConvert.DeserializeObject<IEnumerable<User>>(source)));
【讨论】:
我猜应该是 File.OpenText(pathToFile) 而不仅仅是 OpenText(pathToFile)【参考方案6】:此方法在本地和 Azure 环境中都适用于我。它取自上面乔的回答
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;
这就是调用该方法的方式
string emailContent = ReadFile("./wwwroot/EmailTemplates/UpdateDetails.html");
【讨论】:
以上是关于读取解决方案数据文件 ASP.Net Core的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core 读取appsettings.json
使用 POST 向 ASP.NET Core 传递数据时的长度限制与解决方案
如何从数据库中读取加密值并将其与 ASP.NET Core 中的另一个值进行比较?