У меня есть проект на основе образца 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"
Как я могу читать файлы на стороне сервера и скрывать их от клиента?
перефразировал вопрос для ясности, так как он подразумевается как один вопрос. @mjwills Если все страницы запускаются на клиенте, может быть, я мог бы настроить класс контроллера на сервере, который может получить доступ к файлам?
and keep them hidden from the client? Что вы подразумеваете под the client? Вы имеете в виду the browser? Почему разве вы не хотите, чтобы клиент это увидел?





WASM: [System.IO.FileNotFoundException] Не удалось найти файл «/data.txt» — это стандартное сообщение, отображаемое Blazor при попытке доступа к локальному файлу на клиенте. Чтение из файлов или запись в файлы не разрешены дизайном, так как это нарушение песочницы, обычно используемой Web Assembly и JavaScript.
На сервере вы можете создать веб-API, который может локально обращаться к вашим файлам, будь то Json, текст, база данных и т. д., и возвращать результаты в различных форматах вызывающим методам Blazor. Вы можете ограничить доступ к данным в этих файлах, используя аутентификацию и авторизацию.
Надеюсь это поможет...
можете ли вы привести пример создания WebAPI для этого?
Оказывается, это было проще, чем я думал. Я приближался к нему с неправильного угла. Чтобы получить доступ к файлам на стороне сервера, создайте контроллер как таковой:
using Microsoft.AspNetCore.Mvc;
namespace Favlist.Server.Controllers
{
[Route("api/[controller]")]
public class DataFetcher : Controller
{
[HttpGet("[action]")]
public MyDataClass GetData(string action, string id)
{
var str = File.ReadAllText("data.txt");
return new MyDataClass(str);
}
}
}
И вызовите его на своей странице так:
@using System.IO;
@page "/dataview"
@inject HttpClient Http
@if (data == null)
{
<p><em>Loading...</em></p>
}
else
{
<p>@data.Name</p>
}
@functions {
MyDataClass data;
protected override async Task OnInitAsync()
{
data = await Http.GetJsonAsync<MyDataClass>("api/DataFetcher/GetData");
}
}
MyDataClass — это ваш собственный класс, содержащий все, что вам нужно для чтения/записи.
Затем вы можете получить доступ к файлам точно так же, как обычно, в любом месте на сервере. Текущий каталог — это корневая папка вашего Project.Server.
Мой серверный проект Blazor не распознает тип доступа к данным. «Тип имени пространства имен DataClass не найден. Вам не хватает директивы using…». Работает ли это только с Blazor на стороне клиента?
Что такое DataClass? Я добавил новый контроллер на сервер, и Visual Studio понятия не имеет, что это такое. Пожалуйста, отредактируйте свой ответ
@softwareisfun DataClass — это ваш собственный класс, содержащий все, что вы хотите читать/писать, реализация должна быть довольно простой, как вы можете видеть в примере реализации контроллера. Я обновил ответ для большей ясности. Надеюсь, это поможет!
Просто опечатка - File.ReadAllTest должен быть текстом, чтобы не путать других (после множества проб и ошибок эта красная строка, когда я копировал код, взволновала: D). Также файл System.IO.File, а не ControllerBase.File. Мне потребовалось некоторое время, пока я тоже не узнал об этом ;)
Да, вы можете прочитать файл из папки wwwroot в приложении blazor webassembly. Используйте этот код, чтобы прочитать ваш файл
var response = await client.GetStringAsync(@"sample-data/test.xml");
Я использую приложение Blazor WebAssembly, однако, когда я использую ваш метод, я получаю: System.InvalidOperationException: был предоставлен недопустимый URI запроса. URI запроса должен быть либо абсолютным URI, либо должен быть установлен BaseAddress. - Использую для клиента HttpClient _client = new HttpClient();
Чтобы прочитать файл на стороне сервера, размещенный в вашем проекте, используйте следующее:
System.IO.File.ReadAllText($"{System.IO.Directory.GetCurrentDirectory()}{@"\wwwroot\data.txt"}");
Статья : https://www.peug.net/en/reading-server-side-files-using-blazor/
Blazor работает в клиенте. Он не может получить доступ к серверу. Ему нужно будет сделать HTTP-запрос на сервер, чтобы получить его данные.