Я пытаюсь вставить SignalR в приложение ASPNET MVC. Я сделал все предварительные шаги, перечисленные ниже, в небольшом проекте. Проблема, с которой я сталкиваюсь, заключается в том, что события не передаются клиенту. Отладкой я смог убедиться, что Startup никогда не вызывается методом Configuration начального класса. Можете ли вы сказать мне, если я что-то забыл?
Startup.cs
using Owin;
using Microsoft.Owin;
[assembly: OwinStartup(typeof(TestSignalR.Startup))]
namespace TestSignalR
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Per altre informazioni su come configurare l'applicazione, vedere https://go.microsoft.com/fwlink/?LinkID=316888
app.MapSignalR();
}
}
}
SignalR Hub
using Microsoft.AspNet.SignalR;
namespace TestSignalR
{
public class SRMessageHub : Hub
{
public void PeopleEntrance(string name, string message)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SRMessageHub>();
hubContext.Clients.All.entrance(name, message);
}
public void PeopleExit(string name, string message)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SRMessageHub>();
hubContext.Clients.All.exit(name, message);
}
}
}
Код клиента
<script src="~/scripts/jquery.signalR-2.4.0.min.js"></script>
<script src="~/signalr/hubs"></script>
<script>
var clientHub = $.connection.sRMessageHub;
$(document).ready(function () {
$.connection.hub.start().done(function () {
alert("Connection ok");
});
$.connection.hub.disconnected(function () {
alert("Disconnect");
});
clientHub.client.entrance = function (name, message) {
alert(name + " exit");
};
});
</script>
Редактировать 1
Я добавил LoggingPipelineModel для проверки выполнения вызова и уверен, что вызов метода-концентратора PeopleEntrance проходит через событие OnBeforeOutgoing. Однако клиент не получает никаких сообщений.
Отладчик по-прежнему не останавливается на точках останова внутри метода Configuration.
Startup.cs
using Owin;
using Microsoft.Owin;
using System;
using Microsoft.AspNet.SignalR.Hubs;
using System.Diagnostics;
using Microsoft.AspNet.SignalR;
[assembly: OwinStartup(typeof(TestSignalR.Startup))]
namespace TestSignalR
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Per altre informazioni su come configurare l'applicazione, vedere https://go.microsoft.com/fwlink/?LinkID=316888
GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule());
app.MapSignalR();
}
}
public class LoggingPipelineModule : HubPipelineModule
{
protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
{
Debug.WriteLine("=> Invoking " + context.MethodDescriptor.Name + " on hub " + context.MethodDescriptor.Hub.Name);
return base.OnBeforeIncoming(context);
}
protected override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context)
{
Debug.WriteLine("<= Invoking " + context.Invocation.Method + " on client hub " + context.Invocation.Hub);
return base.OnBeforeOutgoing(context);
}
}
}
решаемые
Активируя вход в систему на клиенте, я обнаружил, что SignalR требует определить методы клиента перед началом подключения. Таким образом, перемещение start () в конце решило проблему.
Код клиента
<script src="~/scripts/jquery.signalR-2.4.0.min.js"></script>
<script src="~/signalr/hubs"></script>
<script>
var clientHub = $.connection.sRMessageHub;
$(document).ready(function () {
$.connection.hub.disconnected(function () {
alert("Disconnect");
});
clientHub.client.entrance = function (name, message) {
alert(name + " exit");
};
$.connection.hub.start().done(function () {
alert("Connection ok");
});
});
</script>