Sto cercando di stabilire una connessione tra la mia applicazione ASP.NET Core 3.0 Blazor (lato server) e il servizio Azure SignalR. Finirò per iniettare il mio client SignalR (servizio) in alcuni componenti Blazor in modo che aggiorneranno la mia UI / DOM in tempo reale.
Il mio problema è che ricevo il seguente messaggio quando chiamo il mio .StartAsync()
metodo sulla connessione hub:
Il codice dello stato della risposta non indica l'esito positivo: 404 (non trovato).
BootstrapSignalRClient.cs
Questo file carica la mia configurazione per il servizio SignalR incluso l'URL, la stringa di connessione, la chiave, il nome del metodo e il nome dell'hub. Queste impostazioni vengono acquisite nella classe statica SignalRServiceConfiguration
e utilizzate in seguito.
public static class BootstrapSignalRClient
{
public static IServiceCollection AddSignalRServiceClient(this IServiceCollection services, IConfiguration configuration)
{
SignalRServiceConfiguration signalRServiceConfiguration = new SignalRServiceConfiguration();
configuration.Bind(nameof(SignalRServiceConfiguration), signalRServiceConfiguration);
services.AddSingleton(signalRServiceConfiguration);
services.AddSingleton<ISignalRClient, SignalRClient>();
return services;
}
}
SignalRServiceConfiguration.cs
public class SignalRServiceConfiguration
{
public string ConnectionString { get; set; }
public string Url { get; set; }
public string MethodName { get; set; }
public string Key { get; set; }
public string HubName { get; set; }
}
SignalRClient.cs
public class SignalRClient : ISignalRClient
{
public delegate void ReceiveMessage(string message);
public event ReceiveMessage ReceiveMessageEvent;
private HubConnection hubConnection;
public SignalRClient(SignalRServiceConfiguration signalRConfig)
{
hubConnection = new HubConnectionBuilder()
.WithUrl(signalRConfig.Url + signalRConfig.HubName)
.Build();
}
public async Task<string> StartListening(string id)
{
// Register listener for a specific id
hubConnection.On<string>(id, (message) =>
{
if (ReceiveMessageEvent != null)
{
ReceiveMessageEvent.Invoke(message);
}
});
try
{
// Start the SignalR Service connection
await hubConnection.StartAsync(); //<---I get an exception here
return hubConnection.State.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
private void ReceiveMessage(string message)
{
response = JsonConvert.DeserializeObject<dynamic>(message);
}
}
Ho esperienza nell'uso di SignalR con .NET Core in cui lo aggiungi, quindi il Startup.cs
file che usa .AddSignalR().AddAzureSignalR()
e mappa un hub nella configurazione dell'app e farlo in questo modo richiede che vengano stabiliti alcuni parametri di "configurazione" (cioè stringa di connessione).
Data la mia situazione, da dove HubConnectionBuilder
viene la stringa di connessione o una chiave per l'autenticazione al servizio SignalR?
È possibile che il messaggio 404 sia il risultato della chiave mancante / stringa di connessione?
Uri
e costruire quella completa via Uri (Uri, stringa)
.WithUrl(signalRConfig.Url + signalRConfig.HubName)
Puoi verificare che ciò stia generando l'URL corretto? (Per breakpoint o registrazione?)