使用Blazor读取服务器端文件

时间:2019-03-28 22:38:57

标签: c# web .net-core webassembly 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"

如何读取服务器端文件并使它们对客户端隐藏?

4 个答案:

答案 0 :(得分:1)

WASM:[System.IO.FileNotFoundException]找不到文件“ /data.txt” 是Blazor在您尝试访问客户端上的本地文件时显示的标准消息。 设计不允许从文件读取或写入文件,因为这违反了Web程序集和JavaScript通常共享的沙箱。

在服务器上,您可以创建一个Web API,该API可以本地访问文件(无论是Json,文本,数据库等),并将各种格式的结果返回给调用Blazor方法。您可以使用身份验证和授权来限制对这些文件中数据的访问。

希望这对您有帮助...

答案 1 :(得分:0)

事实证明,这比我想象的要容易。我从错误的角度接近它。要访问服务器端文件,请按以下方式创建一个控制器:

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根文件夹。

答案 2 :(得分:-1)

是的,您可以从blazor webassembly应用程序的wwwroot文件夹中读取文件。 使用此代码读取文件

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

答案 3 :(得分:-1)

要读取放置在项目中的服务器端文件,请按以下方式使用:

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

文章:https://www.peug.net/en/reading-server-side-files-using-blazor/