我有一个基于Blazor样本的项目,包括.Client
,.Server
和.Shared
项目。我在服务器上有一个文本文件data.txt
,我希望能够使用标准的StreamReader
/ System.IO.File
方法读/写。由于Blazor在沙盒中运行,我想我无法访问整个文件系统,就像在普通的Windows应用程序中一样?我已将文件放在wwwroot
目录中,如果在浏览器中输入url/data.txt
,我甚至可以从客户端访问该文件,以便提供文件,我不想这样做,但是尝试将该文件读取为这样:
var file = File.ReadAllText("data.txt");
导致错误:
WASM: [System.IO.FileNotFoundException] Could not find file "/data.txt"
如何读取服务器端文件并将其隐藏在客户端之外?
WASM:[System.IO.FileNotFoundException]无法找到文件“/data.txt”是Blazor在您尝试访问客户端上的本地文件时显示的标准消息。设计不允许从文件读取或写入文件,因为它违反了沙盒,通常由Web Assembly和JavaScript共享。
在服务器上,您可以创建一个Web API,可以本地访问您的文件,无论是Json,文本,数据库等,并将各种格式的结果返回给调用Blazor方法。您可以使用身份验证和授权来限制对这些文件中的数据的访问。
希望这可以帮助...
事实证明这比我想象的要容易。我从错误的角度接近它。要访问服务器端文件,请按以下方式创建控制器:
using Microsoft.AspNetCore.Mvc;
namespace Favlist.Server.Controllers
{
[Route("api/[controller]")]
public class DataFetcher : Controller
{
[HttpGet("[action]")]
public DataClass GetData(string action, string id)
{
var str = File.ReadAllTest("data.txt");
return new DataClass(str);
}
}
}
并在您的页面中调用它,如下所示:
@using System.IO;
@page "/dataview"
@inject HttpClient Http
@if (data == null)
{
<p><em>Loading...</em></p>
}
else
{
<p>@data.Name</p>
}
@functions {
DataClass data;
protected override async Task OnInitAsync()
{
data = await Http.GetJsonAsync<Dataclass>("api/DataFetcher/GetData");
}
}
然后,您可以按照通常的方式访问文件,无论您在服务器上的任何位置。当前目录是Project.Server根文件夹。