Я пытаюсь установить соединение между моим приложением ASP.NET Core 3.0 Blazor (на стороне сервера) и службой Azure SignalR. В итоге я добавлю свой клиент (сервис) SignalR в несколько компонентов Blazor, чтобы они обновляли мой UI / DOM в реальном времени.
Моя проблема в том, что я получаю следующее сообщение, когда я вызываю мой .StartAsync()
метод при подключении к концентратору:
Код статуса ответа не указывает на успех: 404 (Не найдено).
BootstrapSignalRClient.cs
Этот файл загружает мою конфигурацию для службы SignalR, включая URL, строку подключения, ключ, имя метода и имя концентратора. Эти настройки фиксируются в статическом классе SignalRServiceConfiguration
и используются позже.
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);
}
}
У меня есть опыт использования SignalR с .NET Core, где вы добавляете его, чтобы Startup.cs
файл использовал .AddSignalR().AddAzureSignalR()
и отображал концентратор в конфигурации приложения, и для этого необходимо установить определенные параметры конфигурации (например, строку подключения).
Учитывая мою ситуацию, где можно HubConnectionBuilder
получить строку подключения или ключ для аутентификации в службе SignalR?
Возможно ли, что сообщение 404 является результатом отсутствия ключа / строки подключения?
источник
.WithUrl(signalRConfig.Url + signalRConfig.HubName)
Можете ли вы проверить, что это приводит к правильному URL? (Uri
и построить полную через Uri (Uri, string)Ответы:
Хорошо, так получается, что документации не хватает ключевой информации здесь. Если вы используете клиент .NET SignalR, подключающийся к службе Azure SignalR, вам необходимо запросить токен JWT и представить его при создании подключения к концентратору.
Если вам нужно пройти аутентификацию от имени пользователя, вы можете использовать этот пример.
В противном случае вы можете настроить конечную точку «/gotiate» с помощью веб-API, такого как функция Azure, чтобы получить для вас токен JWT и клиентский URL; это то, что я в итоге сделал для своего варианта использования. Информацию о создании функции Azure для получения вашего токена JWT и URL-адреса можно найти здесь.
Я создал класс для хранения этих двух значений как таковых:
SignalRConnectionInfo.cs
Я также создал внутри себя метод
SignalRService
для обработки взаимодействия с конечной точкой «/gotiate» веб-API в Azure, создания экземпляра подключения к концентратору и использования делегата event + для получения сообщений следующим образом:SignalRClient.cs
functionsClient
Просто сильно типизированныеHttpClient
предварительно сконфигурировано с базовой URL иFunctionsClientConstants.SignalR
является статическим классом с «/» переговорами путями , который прилагается к базовому URL.После того, как я все это настроил, я позвонил,
await hubConnection.StartAsync();
и это "подключилось"!После всего этого я настроил статическое
ReceiveMessage
событие и делегат следующим образом (в том жеSignalRClient.cs
):Наконец, я реализовал
ReceiveMessage
делегата:Я предоставил обновления документации для службы поддержки Azure SignalR и надеюсь, что это поможет кому-то еще!
источник