很简单的问题.为什么刚刚连接的客户端没有收到任何消息,但所有其他客户端都接收到广播?发送连接消息的客户端的正确方法是什么?
protected override void OnConnected(HttpContextBase context, string clientId)
{
GameAction message = new GameAction();
message.text = "Player connected";
Connection.Broadcast(serializer.Serialize(message));
GameAction gamestate = new GameAction();
gamestate.text = "Some client specific info";
Send(clientId, serializer.Serialize(gamestate));
}
Run Code Online (Sandbox Code Playgroud) 这个问题与另一个线程有关,您可以在这里阅读:使用SignalR 进行表单身份验证,我在用户dfowler的帮助和耐心下尝试了解如何强制在SignalR Hub上形成ASP .NET Forms身份验证.
问题描述:我希望只有经过身份验证的用户才能连接SignalR Hub并接收/发送消息.
入侵场景:入侵者可以捕获/访问访问客户端计算机上临时文件的网页的HTML和Javascripts.因此,该入侵者可以知道建立/使用与Hub的连接所需的所有细节(方法,集线器名称等).dfowler提出的解决方案是实现IConnect:
您将实现IConnected并在Connect if(!Context.User.Identity.IsAuthenticated)中抛出以下代码抛出新的异常("GTFO");
所以我试着用这样的东西
public System.Threading.Tasks.Task Connect()
{
if (!Context.User.Identity.IsAuthenticated
|| !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2")
))
throw new Exception("User not authorized");
return null;
}
Run Code Online (Sandbox Code Playgroud)
一旦经过测试,问题在于,当调用Connect方法时,连接已经建立并且普通抛出异常将无济于事(如果我得到了正确的实际连接应该用于在连接时向客户端发送消息)抛出异常只会产生一条未发送的欢迎消息).
事实上,从我的测试中,客户端仍然可以读取所有消息(并发送它们).
现在,我想到的方法:
还有其他方法吗?任何方式终止服务器端的连接或应该接受唯一真正的身份验证是主机网页之一(打开所有signalR客户端攻击的大门?)
编辑
以下是我使用IConnect.Connect无条件抛出异常的方法(浏览器IE9)时客户端 - 服务器通信的顺序:

它看起来像foreverFrame失败但是longPolling回退正在建立并且仍然有效 - 这是在抛出Javascript中捕获的错误之后
if (connection.state === signalR.connectionState.connecting) {
// Connection hasn't been started yet
throw "SignalR: Connection has not …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的.net 4桌面应用程序,用c#编写,需要显示插入到SQL Server(2005)上的表中的一些数据.数据本身非常简单,只有一行大约10列(主要是其他数据的计数).
我可以每隔x间隔从应用程序轮询一次sql server,但我的首选是让sql server将数据推送到这个应用程序,如果可能的话,因为"新数据"的时间通常是不规则的.
简而言之,我想知道这是否可行.在发布这个问题之前做了一些研究,我发现了一些可能性.
1)SignalR:我发现这个问题看起来很有希望,但这似乎是在Web应用程序而不是桌面应用程序的上下文中.在审查了signalR wiki之后,在我看来它需要某种Web服务或其他我想要避免的http连接.
2)Sql server更改跟踪,从这个问题.首先,我不是在sql 2008上,所以我假设我必须安装或配置它(这不是问题),但我也不确定这是否会提供我需要的东西.
我还要提到的是,这个客户端应用程序可能存在于100多个不同的PC上,这些都需要在数据更改时得到通知.
那么,这样的事情可能吗?如果问题有点含糊,我道歉 - 并提前感谢您的帮助!
我想知道是否可以为gmail聊天或hotmail之类的私人聊天创建聊天..我怎样才能确保只有客户A与客户B会话?如何确保只有已登录的客户端可以通话?
当打开几个标签时,不可能使用SignalR,每个标签分配有唯一的ID(参见.当SignalR一次进行8-10个连接时,实时聊天不起作用).
但.我在此stackoverflow问题中描述了一种解决方法.我们的想法是按顺序覆盖connectionid,每个打开的选项卡都有相同的连接ID:因此,逻辑上,在我的特定情况下,没有理由为每个选项卡都有唯一的ID,因为每个选项卡由一个MyApplicationUserId打开.
无论如何,它已经在stackoverflow中被注意到(请参阅SignalR如何处理重复的连接ID?),该connectionid必须是唯一的.并且他们说,IConnectionIdGenerator将在一个upcomming版本中删除.
所以,这是一条死胡同.我必须使用唯一的ID,但我不能使用SignalR打开几个浏览器选项卡.
谢谢.梅德.
我正在开发一个使用SignalR的用户跟踪解决方案,作为学习SignalR的有趣项目,用于ASP.NET MVC应用程序.
目前,我可以跟踪已记录的用户以及他们在特定页面上的时长.如果他们移动到另一个页面,我也跟踪它并且SignalR正在更新的计时器重置...许多其他功能被实现或部分实现.
我面临的问题是如何在SignalR集线器内获得完整的URL控制器/动作/参数?
当我使用HttpContext.Current.Request.Urlurl时总是/ signalr/connect.
注意:
var hub = $.connection.myHub;
$.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)
在_Layout.cshtml中.
更新:
我试过用
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.start().done(function () {
hub.setLocation(location);
});
Run Code Online (Sandbox Code Playgroud)
并且位置正确传递但我不需要在Connect()任务上使用它.是否有可能做到这一点?
更新2:
这种方法不起作用
var hub = $.connection.myHub;
$.connection.hub.start(function(){hub.setLocation(location)});
Run Code Online (Sandbox Code Playgroud)
就像Connect()之前所说的那样.
在我的中心我有几种方法,但我想传递一个值(在我的情况下是一个位置)Connect(),这可能吗?
public class MyHub : Hub, IDisconnect, IConnected
{
public Task Connect()
{
//do stuff here
//and i would like to have the **location** value
}
public Task Disconnect()
{
//do stuff here
}
} …Run Code Online (Sandbox Code Playgroud) 我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题.我正在使用自定义成员资格提供程序的Forms身份验证.
我有SignalR的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看这个视图(并且都连接到与之关联的SignalR组)视图).但是,当人们登录时,我一直遇到麻烦.当用户身份发生变化时,建议的做法是"重新连接"基础SignalR连接?该视图是其他操作显示的其他视图之一.这是唯一包含SignalR javascript的人.
事实上,我甚至都不是对用户的身份感兴趣,因此以某种方式关闭用户亲和力就行了(但我找不到办法做到这一点).用户更改也可以触发页面重新加载,因为登录/注销发生在除维持连接的窗口之外的窗口中,因此后者没有用户的焦点.
问题,换句话说:当用户身份从登录用户更改为已注销用户时,如何保持基础SignalR连接,反之亦然?
在页面上处理登录/注销事件,如下所示:
$("a[href='/Account/Logout']").click(function () {
$.connection.hub.stop();
});
这可行,但这将要求用户能够登录或退出的每个页面上的SignalR,而不仅仅是实际使用SignalR的页面.
在使用ASP.NET会话ID键入的集线器上添加其他组,该组在登录和注销之间保持一致.登录或注销后,我通过向具有该会话ID的组发送重新连接的触发器来通知客户端.事实证明这已经太晚了,在请求结束时身份已经被更改,因此异常被解雇了.
对于该特定用例,向用户呈现包括SignalR的页面.我按照惯例加入集线器:
var hub = $.connection.theNameOfTheHub;
$.connection.hub.start().done(function () {
hub.server.joinList(id);
});
Run Code Online (Sandbox Code Playgroud)
出于本示例的目的,我更改了一些名称.基本上,我想监视页面上显示的项目列表的更改.我使用列表的id作为标识符加入组.
异常消息是" System.InvalidOperationException:无法识别的用户身份.在活动的SignalR连接期间,用户身份不能更改." 它来自Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId.我查找了源代码,并将实际内容context.Request.User.Identity.Name与存储在连接令牌中的内容进行了比较.这一切都有道理,但我正在寻找的是一种解决方法.
我安装了Microsoft.AspNet.SignalR.Utils版本1.1.0.0,然后使用signalr.exe ipc安装性能计数器.
在"信号器"类别下的性能监视器中,我可以看到所有性能计数器,但它没有说明实例......所以如果我在监视器中添加其中一个计数器,它们就不会出现.
我的信号服务器服务器作为asp.net web api托管在IIS上.服务器和客户端都使用相同版本的信号器,即1.1.0.0.
任何的想法?
我们有一个基于网络的游戏(SignalR用于通信),我们的工作量将是:
使用以下服务器是否有任何问题处理负载(假设信号器有80-90%的CPU)?
(通过长轮询我们可以很容易地做到@ 5-10%cpu)
我正在使用SignalR进行长轮询.我发现用户会话在基于singalr的网页发出/ signar/ping请求后立即结束(正在调用ASP.NET Session_End)(如此屏幕截图所示).我浏览了http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events,但无法在问题后找出明确的答案.