Хорошо, получается, что в документации отсутствует ключевая информация. Если вы используете клиент .NET SignalR, подключающийся к службе Azure SignalR, вам необходимо запросить токен JWT и представить его при создании подключения к концентратору.
Если вам необходимо пройти аутентификацию от имени пользователя, которого выможете использовать в этом примере.
В противном случае вы можете настроить конечную точку «/ согласование» с помощью веб-API, такого как функция Azure, для получения маркера JWT и URL-адреса клиента;это то, что я в итоге сделал для своего варианта использования. Информацию о создании функции Azure для получения вашего токена JWT и URL-адреса можно найти здесь .
Я создал класс для хранения этих двух значений следующим образом:
SignalRConnectionInfo. cs
public class SignalRConnectionInfo
{
[JsonProperty(PropertyName = "url")]
public string Url { get; set; }
[JsonProperty(PropertyName = "accessToken")]
public string AccessToken { get; set; }
}
В моем SignalRService
я также создал метод для взаимодействия с конечной точкой «/gotiate» веб-API в Azure, создания экземпляра подключения к концентратору и использования события +делегат для получения сообщений следующим образом:
SignalRClient.cs
public async Task InitializeAsync()
{
SignalRConnectionInfo signalRConnectionInfo;
signalRConnectionInfo = await functionsClient.GetDataAsync<SignalRConnectionInfo>(FunctionsClientConstants.SignalR);
hubConnection = new HubConnectionBuilder()
.WithUrl(signalRConnectionInfo.Url, options =>
{
options.AccessTokenProvider = () => Task.FromResult(signalRConnectionInfo.AccessToken);
})
.Build();
}
functionsClient
- это просто строго типизированный HttpClient
, предварительно настроенный с базовым URL, а FunctionsClientConstants.SignalR
- этостатический класс с путем "/gotiate", который добавляется к базовому URL.
После того, как я все это настроил, я вызвал await hubConnection.StartAsync();
и он "подключился"!
Послевсе это я настроил статическое событие ReceiveMessage
и делегат следующим образом (в том же SignalRClient.cs
):
public delegate void ReceiveMessage(string message);
public static event ReceiveMessage ReceiveMessageEvent;
Наконец, я реализовал делегат ReceiveMessage
:
await signalRClient.InitializeAsync(); //<---called from another method
private async Task StartReceiving()
{
SignalRStatus = await signalRClient.ReceiveReservationResponse(Response.ReservationId);
logger.LogInformation($"SignalR Status is: {SignalRStatus}");
// Register event handler for static delegate
SignalRClient.ReceiveMessageEvent += signalRClient_receiveMessageEvent;
}
private async void signalRClient_receiveMessageEvent(string response)
{
logger.LogInformation($"Received SignalR mesage: {response}");
signalRReservationResponse = JsonConvert.DeserializeObject<SignalRReservationResponse>(response);
await InvokeAsync(StateHasChanged); //<---used by Blazor (server-side)
}
Я предоставил обновления документации для сигнала AzureСлужба поддержки R и надежда, что это поможет кому-то еще!