Как управлять SignalR из конечной точки API - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть приложение Blazor, у которого также есть API. У меня есть введенный синглтон, который имеет некоторые значения. На странице моего блэйзер-приложения отображаются те же значения синглтона. Моя цель состоит в том, чтобы обновить компонент Blazore Page / Razor, который просматривают клиенты, когда я обновляю значение синглтона с помощью API.

Я пытался использовать signalR, аналогичный описанному здесь Учебному пособию: https://www.youtube.com/watch?v=1RQ_c3NPkgs

Ниже мой код:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{

    // All other services
    ...

    // Signal R
    app.AddSignalR();
}

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapBlazorHub();
    endpoints.MapFallbackToPage("/_Host");
    endpoints.MapHub<MessageHub>("/_MessageHub");
});

Страница Blazor

@using Marel.LairageScanner.Services.Interfaces
@using Microsoft.AspNetCore.SignalR.Client 
@using Marel.LairageScanner.BlazorApp.Data.Communication 
@inject IPenService penService

<b>Message Retrieved : @penService.CurrentPen</b><br>
<b>Connection State : @connectionState</b>

@code {      

    private HubConnection hubConnection;

    protected override async Task OnInitializedAsync()
    {
        hubConnection = new HubConnectionBuilder()
        .WithUrl("https://localhost:44332/_MessageHub")
        .Build();

        hubConnection.On(MessageCommand.Update, UpdateState);

        await hubConnection.StartAsync();
    }

    void UpdateState() => StateHasChanged();
}

Конечные точки API

private readonly IPenService penService;
private readonly HubConnection hubConnection;

public ScannerController(penService)
{
    this.penService = penService;

    // Initalize thi hub controller
    hubConnection = new HubConnectionBuilder()
    .WithUrl("https://localhost:44332/_MessageHub")
    .Build();
}

[HttpPut("{value}")]
public async Task<IActionResult> SetValue(
    [FromRoute] string value,
    CancellationToken cancellationToken)
{

    penService.CurrentPen = value;
    await hubConnection.StartAsync();
    await hubConnection.SendAsync(MessageCommand.Update);
    await hubConnection.StopAsync();

    return Ok();
}

Надеюсь, это поможет, если у вас есть какие-либо вопросы, пожалуйста, задавайте.

1 Ответ

0 голосов
/ 24 апреля 2020

Мне удалось найти решение, но я не знал, почему другой метод не работает.

Вместо использования SendAsync я использовал InvokeAsync и передал имя метода. С SendAsync Хаб не был поражен. Как уже упоминалось, я не знаю, почему это так.

...