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

How to get local data source in server side applications?

我正在使用 Blazor 服务器端应用程序。因为我需要参考本地数据源。

我使用了 Http as like 默认客户端示例。

@code{

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

但我一直面临如下问题,

谁能指导我解决这个问题?

与 client-side Blazor 不同,server-side 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 实例(最好)

回答您的问题

How to get local data source in server side applications:

定义一个可以直接访问数据库的本地服务可以解决问题。查看默认的 server-side 模板如何做到这一点。您可以在服务中使用 Entity Framework 核心来访问数据库对象。

请注意,如果您决定切换到 Blazor client-side,使用直接访问数据库的本地服务可能会产生不利影响,因为在 client-side Blazor 上执行的数据访问服务与您的服务器是不可能的。这是规划如何实施 Blazor 应用的重要性的示例。就个人而言,我会坚持使用 HttpClient 并避免使用服务,但这是我个人的看法。其他人可能不这么认为。

希望这对您有所帮助...

托管模式

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

    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)                 |
                      |
                      |

奖金

要轻松地从托管模型切换到服务器端,您可以为两者(server functionsrest client transport class)创建一个 IServiceInterface,并使用依赖注入在每个模型上使用一个或其他实现设想。简体:

                   hosted model 

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

                   server side model

这将有助于从服务器端应用程序读取 json 文件,

@using Newtonsoft.Json

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

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

    }
}