【问题标题】:ASP.NET SignalR not sending messages to clientASP.NET SignalR 不向客户端发送消息
【发布时间】:2012-11-30 02:05:13
【问题描述】:

我意识到 SignalR 和 ASP.NET SignalR 之间存在重大变化,因此我更改了代码以适应这种变化。但由于某种原因,我无法找出正确的更改。

我遇到的问题是服务器没有向客户端发送消息。

旧 SignalR 代码:

服务器

var context = GlobalHost.ConnectionManager.GetHubContext<Dashboard>();
var subscribers = context.Clients;

if (!string.IsNullOrWhiteSpace(message.Source))
{
    var subscriber = subscribers[message.Source];

    subscriber.messageReceived(message);
}

客户

$.connection.dashboard.messageReceived = function(){...};

新代码(ASP.NET SignalR):

服务器

var context = GlobalHost.ConnectionManager.GetHubContext<Dashboard>();
var subscribers = context.Clients;

if (!string.IsNullOrWhiteSpace(message.Source))
{
    var subscriber = subscribers.Group(message.Source);             
    subscriber.messageReceived(message);
}

客户

$.connection.dashboard.client.messageReceived = function(){...};

谁能帮我弄清楚这里出了什么问题?

【问题讨论】:

  • 我希望这个逻辑不在集线器中: var context = GlobalHost.ConnectionManager.GetHubContext(); var 订阅者 = context.Clients;
  • @dfowler:它在 Hub 中的静态方法中:public static void Publish(DashboardMessage message)。与发布一起,此静态方法还缓存消息以保留最后一个好的副本。为简洁起见,我忽略了这些细节。但我很想听听您对此的看法。
  • 你可能想看看这个问题stackoverflow.com/questions/13531314/…

标签: signalr signalr-hub signalr.client


【解决方案1】:

我能够让您的代码逻辑正常工作。这是我根据您的逻辑构建的:

服务器:

public class Status : Hub
{
    public override Task OnConnected()
    {
        Groups.Add(Context.ConnectionId, "foo");
        return base.OnConnected();
    }

    public void foo()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<Status>();
        var subscribers = context.Clients;
        var subscriber = subscribers.Group("foo");
        subscriber.messageReceived("ello");
    }
}

客户:

var status = $.connection.status;

status.client.messageReceived = function (val) {
    alert(val);
}

$.connection.hub.start().done(function() {
    status.server.foo();
});

我对为什么您的实施不起作用的唯一想法是:

  1. 您没有将连接 ID 添加到您尝试向其广播的组(请参阅我在服务器上的 OnConnected 函数)。
  2. 在 messageReceived 的 .client 方法中,您不允许将值作为参数传递。除非您在函数中解析参数对象,否则您将无法获取消息值。
  3. 您的 message.Source 不正确

希望这会有所帮助!

【讨论】:

  • #1 - 我实际上正在这样做:` $.connection.dashboard.server.subscribe(self.subscribedSources)` 和 Subscribe 确实 foreach (var @group in sources) { Groups.Add(Context.ConnectionId, @group); } #2 - client.messageReceived 确实需要在一个参数中,我只是在帖子中省略了它,认为它至少不需要讨论(显然我不好)。 #3 - 为什么这么说?我正在尝试将消息发布到仅订阅的来源。
  • 对于#3,我只是说“如果你的”消息来源不正确。我会调试 foreach 逻辑并确保正确保存/调用所有组命名。
  • 嗯,它适用于 SignalR v0.5.3。完全相同的代码行(发布部分除外)。知道我是否在新版本的某个地方遗漏了一个中间步骤吗?
  • 哇,你知道吗,在新版本中你有一个 App_Start 文件夹(Nuget 为你安装了吗?)。如果是这样,您是否有一个调用 .MapHubs 的 .cs 文件?在 0.5.3 中,您不必专门调用 .MapHubs,但在最新的预发布版本中,您现在必须这样做。
  • 我有一个 RegisterHubs.cs(它是一个 MVC 项目),它通过 WebActivator 调用 RouteTable.Routes.MapHubs(); 。里面应该还有其他东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2016-09-19
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多