#azure #.net-core #signalr
#azure #.net-ядро #signalr
Вопрос:
У меня есть моя служба SignalR, и я пытаюсь подключить ее к простому приложению .Net Core. При вызове браузера https://imubitsignalr.service.signalr.net:5001/client/negotiate?hub=usercount
я получаю сообщение об ошибке ERR_CONNECTION_TIMED_OUT.
Чего мне не хватает?
Программа: index.cshtml
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function () {
function bindConnectionMessage(connection) {
var messageCallback = function (message) {
console.log('message' message);
if (!message) return;
var userCountSpan = document.getElementById('users');
userCountSpan.innerText = message;
};
connection.on("updateCount", messageCallback);
connection.onclose(onConnectionError);
}
function onConnected(connection) {
console.log('connection started');
}
function onConnectionError(error) {
if (error amp;amp; error.message) {
console.error(error.message);
}
}
var connection = new signalR.HubConnectionBuilder().withUrl('/chat').build();
bindConnectionMessage(connection);
connection.start()
.then(function () {
onConnected(connection);
})
.catch(function (error) {
console.error(error.message);
});
});
</script>
В startup.cs я установил:
services.AddSignalR(hubOptions => {
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(3);
}).AddAzureSignalR();
код концентратора:
public class UserCount : Hub
{
private static int Count;
public override Task OnConnectedAsync()
{
Count ;
base.OnConnectedAsync();
this.Clients.All.SendAsync("updateCount", Count);
return Task.CompletedTask;
}
public override Task OnDisconnectedAsync(Exception exception)
{
Count--;
base.OnDisconnectedAsync(exception);
this.Clients.All.SendAsync("updateCount", Count);
return Task.CompletedTask;
}
}
сопоставление концентратора:
app.UseAzureSignalR(routes =>
{
routes.MapHub<UserCount>("/chat");
});
Комментарии:
1. Пожалуйста, добавьте код конфигурации вашего концентратора в серверную часть. Также я заметил, что вы пытаетесь подключиться
hub=usercount
, но в коде клиента, который у вас естьwithUrl('/chat')
, поэтому было бы важно увидеть пример кода конфигурации серверного концентратора.2. @Kiril1512 Спасибо! Я добавил его. моя ошибка после установки времени ожидания `сбой: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404`
3. Добавьте код, который вы используете при запуске, для сопоставления концентратора.
4. @Kiril1512 теперь спасибо!
5. @Kiril1512 Теперь ты видишь проблему?
Ответ №1:
Убедитесь, что вы настроили свое веб-приложение, как в этом примере:
public void Configure(IApplicationBuilder app, HostConfiguration hostConfiguration, ILogger<Startup> logger)
{
base.Configure(app, hostConfiguration, logger);
app.UseWebSockets();
app.UseCors(CorsPolicy);
app.UseAzureSignalR(routes =>
{
routes.MapHub<ChatHub>("/chat");
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((host) => true));
});
services.AddSignalR().AddAzureSignalR(azureOptions =>
{
azureOptions.ConnectionString = "connectionSringHere";
});
}
Комментарии:
1. Спасибо! с какой версией net core вы кодировали? Я с 2.1, и это немного сложно с Cors..
2. Мой веб-сокет все еще прослушивает мой локальный хост, а не SignalRAzure