Чтение серверных файлов с помощью Blazor

У меня есть проект на основе образца 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"

Как я могу читать файлы на стороне сервера и скрывать их от клиента?

Blazor работает в клиенте. Он не может получить доступ к серверу. Ему нужно будет сделать HTTP-запрос на сервер, чтобы получить его данные.

mjwills 28.03.2019 23:40

перефразировал вопрос для ясности, так как он подразумевается как один вопрос. @mjwills Если все страницы запускаются на клиенте, может быть, я мог бы настроить класс контроллера на сервере, который может получить доступ к файлам?

jsmars 28.03.2019 23:45
and keep them hidden from the client? Что вы подразумеваете под the client? Вы имеете в виду the browser? Почему разве вы не хотите, чтобы клиент это увидел?
mjwills 29.03.2019 00:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
13 464
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

WASM: [System.IO.FileNotFoundException] Не удалось найти файл «/data.txt» — это стандартное сообщение, отображаемое Blazor при попытке доступа к локальному файлу на клиенте. Чтение из файлов или запись в файлы не разрешены дизайном, так как это нарушение песочницы, обычно используемой Web Assembly и JavaScript.

На сервере вы можете создать веб-API, который может локально обращаться к вашим файлам, будь то Json, текст, база данных и т. д., и возвращать результаты в различных форматах вызывающим методам Blazor. Вы можете ограничить доступ к данным в этих файлах, используя аутентификацию и авторизацию.

Надеюсь это поможет...

можете ли вы привести пример создания WebAPI для этого?

software is fun 11.09.2020 17:31
Ответ принят как подходящий

Оказывается, это было проще, чем я думал. Я приближался к нему с неправильного угла. Чтобы получить доступ к файлам на стороне сервера, создайте контроллер как таковой:

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 на стороне клиента?

d00d 25.01.2020 14:57

Что такое DataClass? Я добавил новый контроллер на сервер, и Visual Studio понятия не имеет, что это такое. Пожалуйста, отредактируйте свой ответ

software is fun 11.09.2020 17:43

@softwareisfun DataClass — это ваш собственный класс, содержащий все, что вы хотите читать/писать, реализация должна быть довольно простой, как вы можете видеть в примере реализации контроллера. Я обновил ответ для большей ясности. Надеюсь, это поможет!

jsmars 14.09.2020 12:43

Просто опечатка - File.ReadAllTest должен быть текстом, чтобы не путать других (после множества проб и ошибок эта красная строка, когда я копировал код, взволновала: D). Также файл System.IO.File, а не ControllerBase.File. Мне потребовалось некоторое время, пока я тоже не узнал об этом ;)

Nys 12.04.2021 19:44

Да, вы можете прочитать файл из папки wwwroot в приложении blazor webassembly. Используйте этот код, чтобы прочитать ваш файл

var response = await client.GetStringAsync(@"sample-data/test.xml");

Я использую приложение Blazor WebAssembly, однако, когда я использую ваш метод, я получаю: System.InvalidOperationException: был предоставлен недопустимый URI запроса. URI запроса должен быть либо абсолютным URI, либо должен быть установлен BaseAddress. - Использую для клиента HttpClient _client = new HttpClient();

Maciej Pulikowski 27.07.2020 16:07

Чтобы прочитать файл на стороне сервера, размещенный в вашем проекте, используйте следующее:

System.IO.File.ReadAllText($"{System.IO.Directory.GetCurrentDirectory()}{@"\wwwroot\data.txt"}");

Статья : https://www.peug.net/en/reading-server-side-files-using-blazor/

Другие вопросы по теме