如何在服务器端应用程序中获取本地数据源?

时间:2019-06-25 06:46:38

标签: c# blazor blazor-server-side

我正在使用blazor服务器端应用程序。在那我需要引用本地数据源。

我已将Http用作默认客户端示例。

@code{

    ChartData[] dataSource;
    protected override async Task OnInitAsync()
    {
        dataSource = await Http.GetJsonAsync<ChartData[]>("scripts/aapl.json");
    }
}

但是我一直在面对如下问题, enter image description here

有人可以指导我解决此问题吗?

3 个答案:

答案 0 :(得分:2)

托管模式

在托管模式下,您是否需要一个休息端点(或其他类型的传输模式)来访问数据并调用后端操作:

    USER                     BACKEND 
    SIDE

          HTTP
          or other network
          transport.
             |
             |

client ---- dto ---> rest api ----> server functions
(wasm)
             |
             |

服务器端模式

在服务器端模式下,您不需要通过rest api访问服务器数据,您的应用程序正在服务器上执行,只需直接注入服务并调用服务器功能即可,而无需通过网络传输。

    USER                     BACKEND 
    SIDE


                   SignalR
                  (websocket)
                      |
                      |

client <--- virtual dom changes ---> .razor pages ----> server functions
(html                 
 +css                 |
 +js)                 |
                      |
                      |

奖金

要轻松地从托管模型切换到服务器端,可以为{IServiceInterfaceserver functions都创建一个rest client transport class并使用依赖注入在每种情况下使用一个或其他实现。简化:

                   hosted model 

                                   |
         - rest client trans class----> web api ----
        |  (IServiceInterface)     |                |
Client -                           |                |--> server functions
        |                          |                |  (IServiceInterface)
         ------------------------------------------
                                   |

                   server side model

答案 1 :(得分:1)

与客户端Blazor不同,服务器端Blazor要求您将HttpClient添加到DI容器中,并将其注入到组件中。

您可以这样做:

  • 将此代码添加到您的Startup.ConfigureServices方法中:
    // Server Side Blazor doesn't register HttpClient by default
    if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
    {
        // Setup HttpClient for server side in a client side compatible fashion
        services.AddScoped<HttpClient>(s =>
        {
            var uriHelper = s.GetRequiredService<IUriHelper>();
            return new HttpClient
            {
                BaseAddress = new Uri(uriHelper.GetBaseUri())
            };
        });
    }
  • 您还可以使用IHttpClientFactory来配置和创建HttpClient实例(最好)

回答您的问题

  

如何在服务器端应用程序中获取本地数据源:

定义可以直接访问数据库的本地服务可以解决问题。请参阅默认的服务器端模板。您可以在服务中使用Entity Framework Core访问数据库对象。

请注意,如果您决定切换到Blazor客户端,则使用直接访问数据库的本地服务可能会产生不利影响,因为无法在客户端Blazor上执行的数据访问服务与服务器之间进行通信。这是计划如何实施Blazor应用程序重要性的示例。就个人而言,我会坚持使用HttpClient,并避免使用服务,但这是我的个人观点。其他人可能会不同意。

希望这对您有帮助...

答案 2 :(得分:1)

当从服务器端应用程序读取json文件时,这将很有帮助

@using Newtonsoft.Json

....
@code{
protected override async Task OnInitAsync()
    {

        {
            dataSource = JsonConvert.DeserializeObject<ChartData[]>(System.IO.File.ReadAllText("./wwwroot/chartdata.json"));
        }

    }
}