SignalR - 从应用程序中的两个不同位置定义QueryStrings?

时间:2014-01-12 03:07:48

标签: knockout.js signalr signalr-hub signalr.client

我有一个使用用户和连接之间的内存中关联的集线器。此集线器有两个ConnectionMapping实例 - 一个用于聊天连接,一个用于Navbar连接。目标是:

  • 当用户在聊天以外的任何页面上时,他们将打开一个signalR连接,存储在navbarConnections中
  • 当用户在聊天时,他们将打开两个signalR连接 - 一个在navbarConnections中,一个在chatConnections中

这些工作很独立,但他们一起得到了一点小故障。构建我的应用程序的方式是使用包含以下内容的shell(在layoutVM knockout viewModel中):

$.connection.hub.qs = {
        "isChat": false,
        "username": self.emailAddress(),
        "baseUrl": self.baseUrl()
    };
// define client methods
$.connection.hub.start().done(function () {
  // nothing
});

然后,当在shell中加载聊天时,这是定义的(在chatVm knockout viewmodel中):

$.connection.hub.qs = {
    "isChat": true,
    "username": self.currentUsername(),
    "baseUrl": self.baseUrl()
};
$.connection.hub.start().done(function () {
    self.chatIsReady(true);
});

我遇到的问题是,当从Chat中调用signalR时,查询字符串有时是不正确的 - 似乎在LayoutVm中定义的查询字符串覆盖了ChatVm中的查询字符串。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

你正在做什么对我没有意义 - 你应该只启动一次连接(所有集线器将使用相同的连接,即使它可以正常工作,使用多个连接也没有优势);建立连接后,您的客户端应通过集线器方法与服务器进行交互。

因此,当用户加入聊天时,不应尝试启动另一个连接,而应该执行以下操作:

chatHub.server.joinChat(userName);

然后在[{1}}方法中执行OnConnected方法时执行的任何操作。将数据传递到集线器的主要方法应该是hub方法的参数,而不是查询字符串。

答案 1 :(得分:0)

看起来您使用相同的连接来执行这两项操作 - 所以是的,查询字符串将被覆盖。