SignalR JavaScript客户端事件永不引发

时间:2019-03-19 13:20:00

标签: signalr owin startup

我正在尝试将SignalR插入ASPNET MVC应用程序。我已经在一个小项目中完成了下面列出的所有准备步骤。我遇到的问题是事件未转发到客户端。通过调试,我能够验证Startup从未被称为start类的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集线器

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>

0 个答案:

没有答案
相关问题