我正在使用SignalR(0.5.3)集线器作为聊天应用程序,每次击键都发送到服务器(保存在数据库中),中继到所有客户端,并返回一个返回值(各种字符串标记)服务器.
它工作正常,直到应用程序池循环,然后它停止将键击中继到所有客户端(因为我猜想内存服务器状态丢失),并且服务器也不返回任何值.此时,我认为通过SignalR的所有请求都由IIS排队,然后在应用程序池被回收后进行处理.
我的问题是如何处理这种情况,以便所有客户端都知道由于应用程序池回收而导致服务器不可用/延迟,通知用户等待一段时间,然后在重新连接时恢复操作?
我正在尝试用SignalR组建一个简单的"Hello World"样式应用程序.稍微复杂的因素是SignalR集线器需要自托管,而不是IIS/ASP.NET.据我所知,我已经让服务器端正常工作,并且它可以在端口8080上使用,但我在连接客户端时遇到了麻烦.我目前遇到的问题是SignalR客户端似乎忽略了我指定的URL上的端口.
具体来说,我在这里有这个代码:
<head runat="server">
<script type="text/javascript" src="/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/Scripts/json2.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.signalR-0.5.3.js"></script>
<script type="text/javascript" src="http://<%=Request.Url.Host %>:8080/signalr/hubs"></script>
<title>SignalR Test</title>
</head>
<body>
<script type="text/javascript">
$(function () {
// Wire up the client to the SignalR server on the same host
// as the source of this page, but on port 8080.
$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";
var roomHub = $.connection.roomHub;
$('#echoButton').click(function () {
roomHub.echo($('#echoButton').val())
.error(function (err) {
alert(err);
});
});
$.connection.hub.start({ transport: 'auto', xdomain: true })
.done(function () {
console.log('Connected.');
}) …Run Code Online (Sandbox Code Playgroud) 我试图覆盖OnConnected(),OnDisconnected()方法,但我得到:OnConnected()':找不到合适的方法来覆盖
实现IDisconnect,IConnect接口以及在Connect()和Disconnect()中进行处理与OnConnected(),OnDisconnected()相同吗?
是什么赋予了?
OnConnected()': no suitable method found to override
Run Code Online (Sandbox Code Playgroud) 我将SignalR合并到一个项目中,我已经使用require.js来处理我的脚本依赖项.
我在加载"jquery.signalR-1.1.2"后确保调用"/ signalr/hubs"时遇到了一些麻烦.
我得到了它的工作,但我想知道是否有更好的替代品.
这就是我所拥有的:
require(["signalr"], function () {
require(["noext!/signalr/hubs"], function () {
//initialize and work with the hub here
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在这里创建一个垫片来建立信号器/集线器和信号器脚本之间的依赖关系?
谢谢!
信号器不加载我的集线器:
SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/js'></script>.
Run Code Online (Sandbox Code Playgroud)
我打电话app.MapSignalR();在startup configuration.
我添加到我的cshtml:
<script src="~/Scripts/jquery-1.9.1.js"></script>
<script src="~/Scripts/jquery.signalR-2.0.0.js"></script>
<script src="~/signalr/hubs" type="text/javascript"></script>
<script>
$(document).ready(function () {
window.hubReady = $.connection.hub.start();
});
</script>
Run Code Online (Sandbox Code Playgroud) 我们遇到了一个有趣的问题.以下是我们的设置:
最初我们使用SignalR 0.5.3 - 当我们开始观察到Windows服务与信号R服务器的连接中断时.频率范围从每几分钟到每几个小时.它在大多数情况下重新连接,但偶尔无法重新连接,导致Windows服务每两天丢失一次连接.但它没有固定的模式.这是不相关的服务器重启/备份等,我们添加记录到Windows服务来监视客户端连接上StateChanged事件,并发现,当断开并重新连接会触发该事件,但不能当它不重新连接.
然后我们遇到了这个帖子:客户经常重新连接
并决定将所有内容升级到SignalR 1.0.1(我们不得不在某些时候这样做).Windows服务也升级到框架4.5(来自Framework 2.0),现在引用新的Microsoft.AspNet.SignalR.Client.dll.这也允许我们(使用新添加的连接属性)确定Windows服务实际上使用ServerSentEvents协议.在Windows Server 2012计算机上安装相同的Windows服务使用WebSockets协议.这与此线程一致:SignalR .NET Client不支持Windows 7上的WebSockets
但是,Windows Server 2008 R2服务器上的服务行为没有更改.它仍然断开连接并重新连接,偶尔会失去连接.由于一些限制,我们无法使用Windows Server 2012进行Windows服务,并且无法使用较旧的操作系统.这并不是说使用websockets协议的Windows服务可以解决我们所有的问题(我们没有彻底测试过).
我们尝试的第三件事是从GitHub获取源代码并编译它并升级服务(SignalR Server和客户端) - 这样做是为了确保我们获得带有任何潜在错误修复的最新副本.
但它没有帮助.我们现在处于一种我们认为已经筋疲力尽的选择.建议将不胜感激.谢谢.
=====================================
编辑:更多信息:
好的,现在我们有更多的信息.我们在Windows服务(SignalR Client)中添加了一些代码,每30分钟登录一次SignalR服务器(用于测试连接).
以下是客户端每30分钟发生的事情:
WriteEvent(Now(), "INFO", "PING", "Performing logon procedure with SiteCode = " & msSiteCode & ".")
trans.Invoke("login", New String() {msSiteCode, "", "SERVER", "", ""})
Run Code Online (Sandbox Code Playgroud)
其中trans是从Hub继承的服务器端类的实例,而WriteEvent基本上是写入日志文件的跟踪.
客户端也有一个'isLoggedIn'方法,如下所示:
Private Sub isLoggedIn(ByVal bLoggedIn As String)
If bLoggedIn Then
WriteEvent(Now(), …Run Code Online (Sandbox Code Playgroud) 我在版本2.1.2中使用SignalR.我注意到有两个公共中心类供我使用,Hub并且Hub<T>.前者有一个MSDN页面似乎已经过时,后者根本没有任何MSDN页面.我相信MSDN文档与Nuget的最新版本的SignalR(我正在使用)不是最新的,因为在ReSharper的帮助下反编译的源显示这两个类都继承自基HubBase类.MSDN页面的继承层次结构部分显示Hub该类继承自Object并实现IHub和IDisposable接口,但是反编译的源显示上述HubBase基类,实现IHub接口,而接口又实现IDisposable.
类的非泛型和泛型变体之间的区别在于非泛型的Clients属性返回IHubCallerConnectionContext<dynamic>而泛型变量返回类型IHubCallerConnectionContext<T>.
我想让我的客户输入,所以当我从集线器调用客户端方法时,我会有正确的Intellisense支持和强类型参数.但是,我挣扎的是如何让Hub知道我的客户端模型的方法实际上是在浏览器中调用的.
这是我的TestModel班级:
public sealed class TestModel
{
public String Name { get; set; }
public void Notify() {}
public void NotifyComplex(TestModel model) {}
}
Run Code Online (Sandbox Code Playgroud)
与非通用集线器,我刚刚打电话.Notify()或.Notify(new TestModel() { Name = "sth" })在dynamic立法院约束this.Context.Clients.Client(…)或this.Context.Caller,但与一般类,当我打电话以类似的方式,这些空的方法,浏览器不会通知.
你如何按照它应该使用的方式使用通用集线器类?
我今天一直在尝试使用SignalR,它非常整洁.基本上我想要实现的目标如下:
一旦设备连接,它应该向第一个发送消息.如果有超过1个连接的设备,我想发送两条消息.除最后连接的客户端之外的所有人.并且仅向最后连接的客户端发送一条消息.
当我将它放在自定义API控制器中并且基本上调用动作时,我一直使用的代码非常完美,但这不是我想要的.
我想在OnConnected没有任何用户交互的情况下在设备连接时立即发送消息,但是当我将代码放在OnConnected覆盖内时它会停止工作.它不再发送给特定客户端(首先连接和最后连接).
我希望有人能够帮助我解决这个问题,因为我现在已经敲了几个小时.
public override System.Threading.Tasks.Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);
int amountOfConnections = UserHandler.ConnectedIds.Count;
var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();
if (amountOfConnections == 1)
{
Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
}
else
{
Clients.Clients(allExceptLast).hello("Send to everyone except last");
Clients.Client(lastConnection.Key).hello("Send to only the last one");
}
return base.OnConnected();
}
Run Code Online (Sandbox Code Playgroud) 如何从SignalR获取打开的连接列表而不发送"ping"或手动将它们注册到自己的列表中?
更新: 或者只是为了获取从集线器发送消息的客户端数量.我想知道我应该等待多少响应(无需等待整个超时).
(因为,当从集线器调用客户端时,SignalR不支持返回值,我通过客户端发送到集线器的另一条消息收集结果.)
澄清:我假设SignalR必须知道哪些连接正在发送消息.
我创建了一个SignalR集线器,它包含以下集线器功能:
public bool GetStatus()
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想从我的JS代码中调用此函数并获取此调用的请求.像这样的东西:
var result = hub.server.getStatus();
if (result)
alert('success');
Run Code Online (Sandbox Code Playgroud)
这可能没有返回bool的任务吗?
谢谢.
signalr ×10
signalr-hub ×10
c# ×6
asp.net ×2
javascript ×2
.net ×1
asp.net-mvc ×1
requirejs ×1