Подключение к Azure SignalR Hub из веб-приложения.Net Framework, консольного приложения
У меня есть веб-приложение.Net Framework (v 4.6.1), которое в настоящее время использует ASP.Net SignalR. Я пытаюсь добавить еще один концентратор SignalR, но разрешить этому подключаться с помощью службы Azure SignalR, чтобы мы могли использовать API REST для отправки односторонних сообщений конечным пользователям.
Я следовал этим примерам здесь и здесь, чтобы реализовать эту функцию.
Там 3 основные части
- Подключить к концентратору (наполовину рабочий)
- Отправка сообщений через REST API (работает успешно)
- Получать сообщения от конечного пользователя (не работает)
Hub и Azure SignalR Service созданы и просты, их не нужно отображать.
Образцы кода
Подключение к концентратору в.Net Framework Web App Startup.cs
app.MapAzureSignalR(GetType().FullName, new HubConfiguration { EnableDetailedErrors = true },
options =>
{
options.ConnectionString =
ConfigurationManager.ConnectionStrings["AzureSignalR"].ConnectionString;
});
MapAzureSignalR
приходит из этого пакета Nuget
У меня также есть клиентский JavaScript для обработки соединений и событий хабов, это работает уже несколько месяцев со стандартным ASP.Net SignalR.
Клиентское соединение регистрирует следующую информацию:
Error: You are using a version of the client that isn't compatible with the server. Client version 1.5, server version 2.0.
at Object.error (jquery.signalR.js:179)
at Object.success (jquery.signalR.js:728)
at i (scripts.bundle.js:2)
at Object.fireWith [as resolveWith] (scripts.bundle.js:2)
at A (scripts.bundle.js:4)
at XMLHttpRequest.<anonymous> (scripts.bundle.js:4)
at XMLHttpRequest.wrapFn (zone.js:1166)
at ZoneDelegate.invokeTask (zone.js:421)
at Zone.runTask (zone.js:188)
at ZoneTask.invokeTask [as invoke] (zone.js:496)
Веб-приложение имеет следующие пакеты:
<package id="Microsoft.AspNet.SignalR" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.AspNet.SignalR.Core" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.AspNet.SignalR.JS" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.AspNet.SignalR.SqlServer" version="2.2.2" targetFramework="net45" />
<package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Authorization" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Authorization.Policy" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Connections.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Hosting.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Hosting.Server.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Connections" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Connections.Client" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Connections.Common" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Extensions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Http.Features" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Routing" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.Routing.Abstractions" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.SignalR" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.SignalR.Common" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.SignalR.Core" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.SignalR.Protocols.Json" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.WebSockets" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.AspNetCore.WebUtilities" version="2.1.0" targetFramework="net461" />
<package id="Microsoft.Azure.SignalR" version="1.0.6" targetFramework="net461" />
<package id="Microsoft.Azure.SignalR.AspNet" version="1.0.0-preview1-10317" targetFramework="net461" />
<package id="Microsoft.Azure.SignalR.Protocols" version="1.0.6" targetFramework="net461" />
Подключение к концентратору в консольном приложении.Net Framework
var serviceUtils = new ServiceUtils(ConfigurationManager.ConnectionStrings["Azure:SignalR:ConnectionString"].ConnectionString);
var url = GetClientUrl(serviceUtils.Endpoint);
_connection = new HubConnection(url)
{
ConnectionToken = serviceUtils.GenerateAccessToken(url, userId)
};
IHubProxy proxy = _connection.CreateHubProxy(hubName);
proxy.On("broadcastMessage", (string server, string message) =>
{
Console.WriteLine($"[{DateTime.Now.ToString()}] Received message from server {server}: {message}");
});
_connection.Start();
При регистрации состояния подключения отображается " Отключено", "Подключено", "Отключено".
Пример кода.Net Core
var serviceUtils = new ServiceUtils(connectionString);
var url = GetClientUrl(serviceUtils.Endpoint);
_connection = new HubConnectionBuilder()
.WithUrl(url, options =>
{
options.AccessTokenProvider = () =>
{
return Task.FromResult(serviceUtils.GenerateAccessToken(url, userId));
};
}).Build();
_connection.On("broadcastMessage", (string server, string message) =>
{
Console.WriteLine($"[{DateTime.Now.ToString()}] Received message from server {server}: {message}");
});
await _connection.StartAsync(CancellationToken.None);
Это успешно соединяет и получает сообщения от моей трансляции REST API (см. Ниже)
REST API Broadcast
var url = $"{authenticationUtility.Endpoint}/api/v1/hubs/{hubName.ToLower()}";
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(url)
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authenticationUtility.GenerateAccessToken(url, sender));
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.AcceptCharset.Clear();
request.Headers.AcceptCharset.Add(new StringWithQualityHeaderValue("UTF-8"));
var content = JsonConvert.SerializeObject(new MessageContent{ Target = "broadcastMessage", Arguments = new []{ sender, message}});
request.Content = new StringContent(content, Encoding.UTF8, "application/json");
var response = await httpClient.SendAsync(request);
Это возвращает 202 Accepted
код, как я ожидаю, и отправляет сообщение.Net Core Console App.
На портале Azure я могу видеть соединения, но не могу получать сообщения в подключении к концентратору моего веб-приложения
1 ответ
В итоге я решил эту проблему, создав веб-приложение .Net Core, которое просто управляло концентратором, а затем подключалось к нему с помощью (теперь устаревшего) пакета @aspnet/signalr npm. Этот пакет теперь заменен пакетом @microsoft/signalr.