标签: signalr

SignalR OnConnected - 向连接的客户端发送消息

很简单的问题.为什么刚刚连接的客户端没有收到任何消息,但所有其他客户端都接收到广播?发送连接消息的客户端的正确方法是什么?

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)

c# asp.net signalr

10
推荐指数
1
解决办法
1909
查看次数

SignalR:如何强制认证/终止集线器连接服务器端

这个问题与另一个线程有关,您可以在这里阅读:使用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方法时,连接已经建立并且普通抛出异常将无济于事(如果我得到了正确的实际连接应该用于在连接时向客户端发送消息)抛出异常只会产生一条未发送的欢迎消息).

事实上,从我的测试中,客户端仍然可以读取所有消息(并发送它们).

现在,我想到的方法:

  1. 完美的解决方案:拒绝或终止服务器端的连接:不知道如何在SignalR中执行此操作(我试图在API中找到一个方法,但没有运气)
  2. 检查用户是否属于某个组以避免接收/发送消息给他(但这仍然容易发生洪水/ DOS攻击)
  3. 向客户端发送消息以断开连接:如果我正在与入侵者作战,显然无济于事.

还有其他方法吗?任何方式终止服务器端的连接或应该接受唯一真正的身份验证是主机网页之一(打开所有signalR客户端攻击的大门?)

编辑

以下是我使用IConnect.Connect无条件抛出异常的方法(浏览器IE9)时客户端 - 服务器通信的顺序:

Connect抛出异常时的客户端 - 服务器通信

它看起来像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)

asp.net authentication signalr

10
推荐指数
1
解决办法
4166
查看次数

将数据从Sql Server推送到桌面应用程序

我有一个非常简单的.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上,这些都需要在数据更改时得到通知.

那么,这样的事情可能吗?如果问题有点含糊,我道歉 - 并提前感谢您的帮助!

.net c# sql-server sql-server-2005 signalr

10
推荐指数
1
解决办法
3341
查看次数

与SignalR私聊

我想知道是否可以为gmail聊天或hotmail之类的私人聊天创建聊天..我怎样才能确保只有客户A与客户B会话?如何确保只有已登录的客户端可以通话?

signalr

10
推荐指数
2
解决办法
1万
查看次数

SignalR,有限的唯一连接(打开的选项卡)IIS8,Windows8

当打开几个标签时,不可能使用SignalR,每个标签分配有唯一的ID(参见.当SignalR一次进行8-10个连接时,实时聊天不起作用).

但.我在此stackoverflow问题中描述了一种解决方法.我们的想法是按顺序覆盖connectionid,每个打开的选项卡都有相同的连接ID:因此,逻辑上,在我的特定情况下,没有理由为每个选项卡都有唯一的ID,因为每个选项卡由一个MyApplicationUserId打开.

无论如何,它已经在stackoverflow中被注意到(请参阅SignalR如何处理重复的连接ID?),该connectionid必须是唯一的.并且他们说,IConnectionIdGenerator将在一个upcomming版本中删除.

所以,这是一条死胡同.我必须使用唯一的ID,但我不能使用SignalR打开几个浏览器选项卡.

谢谢.梅德.

signalr

10
推荐指数
1
解决办法
4879
查看次数

获取SignalR中心内的完整URL

我正在开发一个使用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)

asp.net asp.net-mvc-4 signalr signalr-hub

10
推荐指数
1
解决办法
6345
查看次数

在活动SignalR连接期间更改用户身份 - 如何重新连接?

我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题.我正在使用自定义成员资格提供程序的Forms身份验证.

我有SignalR的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看这个视图(并且都连接到与之关联的SignalR组)视图).但是,当人们登录时,我一直遇到麻烦.当用户身份发生变化时,建议的做法是"重新连接"基础SignalR连接?该视图是其他操作显示的其他视图之一.这是唯一包含SignalR javascript的人.

事实上,我甚至都不是对用户的身份感兴趣,因此以某种方式关闭用户亲和力就行了(但我找不到办法做到这一点).用户更改也可以触发页面重新加载,因为登录/注销发生在除维持连接的窗口之外的窗口中,因此后者没有用户的焦点.

问题,换句话说:当用户身份从登录用户更改为已注销用户时,如何保持基础SignalR连接,反之亦然?

我尝试过的事情

  1. 在页面上处理登录/注销事件,如下所示: $("a[href='/Account/Logout']").click(function () { $.connection.hub.stop(); });

    这可行,但这将要求用户能够登录或退出的每个页面上的SignalR,而不仅仅是实际使用SignalR的页面.

  2. 在使用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 1.1.2.

asp.net-mvc asp.net-mvc-4 signalr

10
推荐指数
1
解决办法
4507
查看次数

SignalR性能计数器未在性能监视器中显示

我安装了Microsoft.AspNet.SignalR.Utils版本1.1.0.0,然后使用signalr.exe ipc安装性能计数器.

在"信号器"类别下的性能监视器中,我可以看到所有性能计数器,但它没有说明实例......所以如果我在监视器中添加其中一个计数器,它们就不会出现.

我的信号服务器服务器作为asp.net web api托管在IIS上.服务器和客户端都使用相同版本的信号器,即1.1.0.0.

任何的想法?

signalr

10
推荐指数
2
解决办法
3167
查看次数

SignalR性能

我们有一个基于网络的游戏(SignalR用于通信),我们的工作量将是:

  • 5,000 - 20,000并发客户端,0.5 - 2条消息/客户端/秒〜= 10-40k消息/秒

使用以下服务器是否有任何问题处理负载(假设信号器有80-90%的CPU)?

  • 双六角芯L5639(2.13Ghz)
  • 24G拉姆
  • Windows Server 2012标准

(通过长轮询我们可以很容易地做到@ 5-10%cpu)

high-load signalr

10
推荐指数
1
解决办法
7046
查看次数

使用长轮询时使用/ signalr/ping调用

我正在使用SignalR进行长轮询.我发现用户会话在基于singalr的网页发出/ signar/ping请求后立即结束(正在调用ASP.NET Session_End)(如此屏幕截图所示).我浏览了http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events,但无法在问题后找出明确的答案.

  1. 如何从信号器客户端网页上保持ASP.net用户会话的活动状态?
  2. / ping的实际目的是什么?
  3. 此/ ping呼叫的时间是否可配置?

asp.net signalr signalr.client

10
推荐指数
1
解决办法
7107
查看次数