Чтение файлов на стороне сервера с помощью Blazor - PullRequest
0 голосов
/ 29 марта 2019

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

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

Ответы [ 2 ]

1 голос
/ 29 марта 2019

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

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

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

0 голосов
/ 29 марта 2019

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

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.

...