当我启动Blazor服务器应用程序时,我可以在SignalR服务中看到8台服务器已连接.我不明白为什么. 我的目标是MyRazorPage能够在不创建太多(不必要的?!)服务器的情况下发送和接收(从它自己或某个Azure函数)SignalR消息.
下面是我的代码,下面是我正在使用的DI服务注册:
100
MyRazorPage.razor个
@inject IHubConnectionFactory HubConnectionFactory // see HubConnectionFactory.cs below
MyRazorPage.razor.cs个
public sealed partial class MyRazorPage
{
private HubConnection _hubConnection;
public async ValueTask DisposeAsync()
{
if (_hubConnection is not null)
{
_hubConnection.Remove("MyMethodName");
await _hubConnection.DisposeAsync();
}
}
private async Task HandleHubMessageReceived(ResultDto result)
{
// handle received result
}
private Task SendMessage()
{
// ...
await _hubConnection.SendAsync("MethodName", new ResultDto(Guid.Parse(CustomerId), ResultEnum.Success));
}
protected override async Task OnInitializedAsync()
{
_hubConnection = HubConnectionFactory.CreateHubConnection();
await _hubConnection.StartAsync(CancellationToken);
_hubConnection.On<ResultDto>("MyMethodName", HandleHubMessageReceived);
}
}
100
Package references个
<PackageReference Include="Microsoft.Azure.SignalR" Version="1.24.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.1" />
appsettings.json个
"Azure": {
"SignalR": {
"Enabled": "true",
"ConnectionString": "Endpoint=URL;AccessKey=KEY;Version=1.0;"
},
"SIGNALR_REFRESH_BILLING_PAGE_URI": "https://localhost:44362/MyHub",
Startup.cs个
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
services.AddSignalRHubConnection(config =>{
config.ConnectionString = Configuration["SIGNALR_REFRESH_BILLING_PAGE_URI"] ??
string.Empty;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
if (!env.IsProduction())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseCookiePolicy();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapRazorPages();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<MyHub>($"/{MyHub.HubName}");
});
}
HubConnectionFactory.cs个
public class HubConnectionFactory : IHubConnectionFactory
{
private readonly SignalREndpointConfiguration _configuration;
public HubConnectionFactory(IOptions<SignalREndpointConfiguration> configuration) => _configuration = configuration.Value;
public HubConnection CreateHubConnection()
{
return new HubConnectionBuilder()
.WithUrl(_configuration.ConnectionString)
.Build();
}
}
MyHub.cs个
public class MyHub : Hub
{
public const string HubName = "MyHub";
public async Task SendMessage(ResultDto dto)
{
await Clients.All.SendAsync("MyMethodName", dto);
}
}
我还try 了以下几种方法,但都没有成功:
Approach | Result |
---|---|
Removed "Azure setting" from appsettings.json | HandleHubMessageReceived is not invoked anymore. |
Added services.AddCors() to ConfigureServices in Startup.cs and app.UseCors(policy => policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin() to Startup.Configure() | No difference |