Клиентское событие SignalR никогда не возникает - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь вставить 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>
...