我正在尝试将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>