当前位置: 首页 > 知识库问答 >
问题:

mono组上的SignalR。添加在OnConnected中不工作

万俟渝
2023-03-14

我有一个问题的信号运行在MVC3的单声道。

我创建了以下集线器:

    public class TestHub : Hub
    {
      public override Task OnConnected()
      {
        Trace.WriteLine(String.Format("Join Group: {0}", Context.User.Identity.Name), "SignalR.General");
        Task addTask = Groups.Add(Context.ConnectionId, Context.User.Identity.Name);
        return addTask;
      }

      public void JoinGroup(String group)
      {
        Trace.WriteLine(String.Format("Join Group2: {0}", Context.User.Identity.Name), "SignalR.General");
        Groups.Add(Context.ConnectionId, group);
      }

      public void Echo(String group, String value)
      {
        Trace.WriteLine(String.Format("Echo: {0}, {1}", group, value), "SignalR.General");
        Clients.Group(group).echo(value);
      }
    }

主要问题如下:

用户通过Forms auth登录,并且在context.user.identity.name中正确找到他们的名称。当客户端连接时,调用OnConnected并将连接添加到与用户名同名的单个用户组中。当我用组名作为用户名从客户端调用Echo函数时,如果我在IIS中托管,我会得到正确的响应(响应被发送到客户端),但在Mono中托管时没有得到响应。

另一方面,如果我首先从客户机调用JoinGroup,它在IIS和Apache on Mono中工作。向客户发送消息。所有这些都可以在IIS和mono中使用,但我只需要消息到达特定的用户。

我尝试了这段代码的不同变体,但不知道为什么组注册不应该在OnConnected中工作。

任何想法都将非常感谢,因为我已经浪费了两天在这个问题上。

共有1个答案

戎亦
2023-03-14

我对这个问题进行了深入研究,得出了这个根本原因:

当客户端连接时,它首先尝试使用服务器发送的事件进行连接。这个连接似乎可以工作,并被服务器接收,触发OnConnected并正确地将组id返回给客户端。但是,由于某些原因,当运行在apache2和mono上时,永远不会收到这个响应,EventSource对象的“open”事件也不会激发。这意味着3秒后,SignalR超时客户端上的此连接请求,并假定SSE不工作,并启动一个长轮询会话。

此会话成功连接并可以发送和接收数据,但连接id已发送到服务器,并且OnConnected未再次激发,因此集线器无法获得第二次连接尝试,客户端将无法获得组id。

通过$.connection.hub.start({transport:“longPolling”})直接使用longPolling启动客户端,以仅使用longPolling为代价修复了该问题。

 类似资料:
  • 我的程序服务提供了一些返回

  • 将信号器与IE 11一起使用时,会发生奇怪的行为。脚本: 我们有一些调度程序类型功能,其中调度程序执行一些操作,其他用户可以实时看到更新(查询)。发送的参数可以在IE客户端进行更新,而无需打开开发人员控制台。 但是一个不工作的方法(-获取查询结果-这是一个服务器 以下是我尝试过的: 为什么JavaScript只在IE中打开一次开发者工具后才起作用? 信号员:在IE9下,在我点击F12之前,客户端无

  • 终端: $java Display 1 2 线程“main”java.lang.BootStrapMethoder中出现异常错误:java.lang.NoClassDeffounder错误:java.lang/invoke/StringConcatFactory 在Display.main(Display.java:7) 原因:java.lang.NoClassDeffounder错误:java.

  • 在eclipse中,我会编写代码,最后,我会执行CTRL-SHIFT-O,所有导入都会被添加和重新组织,等等。 我已经看到了做CTRL ALT O的所有其他答案(我把它改回eclipse keymap),我已经做了所有可能的设置。IntelliJ不会添加任何新的导入,我必须手动转到损坏的导入,然后按ALT ENTER,然后鼠标移到导入类,为每个新类。有时候,这种情况不会发生,intelliJ实际上

  • 简介:我想通过使用嵌入的Google脚本中生成的数组来更改Google sheets EmbeddedChart中的数据,而无需先将数据倒入单元格。 Long:我有一个绑定脚本,可以更新先前存在的电子表格。我修改了js中的数据,并希望更改一个嵌入式图表以使用生成的数据数组,而不将数据放在表中。从技术上讲,我不在乎它是一个嵌入的图表,我只想用一个图表制作一个摘要页面,而不想用额外的表格污染文档。不希

  • 问题内容: 我正在使用Mono和Monodevelop在Linux(KUbuntu)中进行项目。我想使用System.Speech库,在Windows 7上的Unity中,Monodevelop完全可以使用该库。在过去的几个小时里,我一直在网上寻找很多东西,据我所知,System.Speech WAS已添加到单核细胞增多症。 我已经更新了所有mono,显示了4.0.2(最新版本),而Monodev