如何从 API 端点控制 SignalR
How to control SignalR from an API Endpoint
我有一个 Blazor 应用,它同时也有一个 API。我有一个注入的单例,它有一些值。我的 Blazor 应用程序上的一个页面显示了相同的单例值。当我使用 API.
更新单例值时,我的目标是更新客户端正在查看的 Blazore Page/Razor 组件
我一直在尝试使用类似于此处教程的 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();
}
希望对您有所帮助,如有任何问题请追问。
我找到了解决方案,但不确定为什么其他方法不起作用。
我没有使用 SendAsync
,而是使用了 InvokeAsync
并传递了方法名称。 SendAsync
集线器未被击中。如前所述,我不知道这是为什么。
我有一个 Blazor 应用,它同时也有一个 API。我有一个注入的单例,它有一些值。我的 Blazor 应用程序上的一个页面显示了相同的单例值。当我使用 API.
更新单例值时,我的目标是更新客户端正在查看的 Blazore Page/Razor 组件我一直在尝试使用类似于此处教程的 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();
}
希望对您有所帮助,如有任何问题请追问。
我找到了解决方案,但不确定为什么其他方法不起作用。
我没有使用 SendAsync
,而是使用了 InvokeAsync
并传递了方法名称。 SendAsync
集线器未被击中。如前所述,我不知道这是为什么。