Как получить локальный источник данных в серверных приложениях? - PullRequest
2 голосов
/ 25 июня 2019

Я использую приложение на стороне сервера Blazor.В этом мне нужно сослаться на локальный источник данных.

Я использовал Http как образец по умолчанию на стороне клиента.

@code{

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

Но я столкнулся с проблемой, как показано ниже, enter image description here

Кто-нибудь может мне помочь исправить это?

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Хост-режим

В размещенном режиме вам нужна конечная точка покоя (или другой вид транспортного режима) для доступа к данным и для вызова внутренних операций:

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

Бонус

Чтобы легко переключаться с размещенной модели на серверную часть, вы можете создать IServiceInterface для обоих (server functions и rest client transport class) и использовать внедрение зависимостей для использования той или иной реализации в каждом сценарии. Упрощенный:

                   hosted model 

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

                   server side model

1 голос
/ 25 июня 2019

В отличие от клиентского 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 и избегал сервисов, но это мое личное мнение.Другие могут думать иначе.

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

...