【问题标题】:SignalR - connection.hubName is undefinedSignalR - connection.hubName 未定义
【发布时间】:2012-11-08 21:30:05
【问题描述】:

我有以下 SignalR 集线器类(仅显示顶部):

[HubName("DataServiceHub")]
public class DataServiceHub : Hub, IDataServiceHub, IDisconnect, IConnected
{
.
.      

然后,我在主函数中使用以下代码在控制台应用程序中自行托管集线器:

string hubsUrl = appSettingsReader.GetValue("hubsUrl", typeof(string)).ToString();
var hubsServer = new Server(hubsUrl);
hubsServer.Configuration.DisconnectTimeout = TimeSpan.Zero;
hubsServer.MapHubs();
hubsServer.Start();

hubsUrl 的值为“http://localhost:4322/”

运行控制台应用程序后,如果我在 Chrome 中浏览“http://localhost:4322/signalr/hubs”,我可以在底部看到 SignalR javascript 和我的集线器:

signalR.dataServiceHub = {
    _: {
        hubName: 'dataServiceHub',

我正在尝试从在 HTTPS/SSL 设置上运行的 MVC3 应用程序连接到此集线器(即站点 url 前缀是“https://localhost/”

在我的 Razor 页面中,我肯定包含 SignalR js:

<script src="/Website/Scripts/kendo/2012.2.710/jquery.min.js" type="text/javascript"></script>
<script src="/Website/Scripts/jquery.signalR-0.5.3.min.js" type="text/javascript"></script>
<script src="http://localhost:4322/signalr/hubs" type="text/javascript"></script>

请注意,我们使用的是 Kendo,因此 jquery js 包含通过它。

然后在 $(document).ready(function () { 我有以下内容:

jQuery.support.cors = true;
var connection = $.hubConnection('http://localhost:4322');
var hub = connection.dataServiceHub;

但“集线器”总是“未定义”。

我在这里错过了什么?

如果这是跨域问题 - 我该如何解决?

【问题讨论】:

  • 我的理解是 HubName 参数应该以小写开头,以匹配客户端名称:“dataServiceHub”,而不是“DataServiceHub”。 (但后来我遇到了与上面类似的问题,所以我当然没有权威。)
  • This page 是相关的,因为由于 NuGet 包不匹配,它会导致 MapSignalR 失败,从而产生“无法导出中心名称”症状。 (这原来是我的问题。)

标签: .net asp.net-mvc-3 ssl https signalr


【解决方案1】:

如果您使用 https,则既不要通过参数也不要通过 'url'-property 指定 url,以防您的集线器在同一个 url 上工作。否则,您的中心将是未定义的。

更新

我搞砸了伙计们。我急于发布我刚刚检测到的特定行为,所以我没有检查任何可能的版本。

但是,应用程序中存在一个错误,该错误通过另一个端口向集线器提供了错误的 URL,而不是所需的端口。因此关闭集线器代理的属性设置 url 使我的客户端正常工作。

注意您的应用程序提供的链接...

【讨论】:

    【解决方案2】:

    集线器有 2 种编程模型,您正在混合使用它们:

    1. http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client
    2. http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client

    如果您滚动到这些页面的底部,会有一个示例向您展示在每个模型中使用跨域所需的操作。

    【讨论】:

    • 嗨,从那以后我实际上已经更新了代码并尝试了两者。所以我现在有: $.connection.hub.url = 'localhost:4322/signalr' 后跟 var hub = $.connection.dataServiceHub;但仍然未定义集线器
    • 另一个注意事项:如果我在我们拥有的另一个 Web 项目(位于同一个 localhost 域中)上托管相同的集线器类,那么相同的 javascript 客户端代码可以工作(唯一的变化是 url为 $.connection.hub.url 设置)。
    • 您可以在远程项目中查看生成的脚本,看看是否生成了集线器localhost:4322/signalr/hubs
    • 如果您的意思是在浏览器中加载该 url,那么是的,集线器已经生成 - 我将那部分的输出放在第一篇文章中。
    • 如果你把所有的部分放在一起,你可以弄清楚为什么它是未定义的。当您包含该脚本时,它会在页面上声明一个全局 $.connection.hub 和 $.connection.hub1..hubn 作为属性。如果您查看生成的脚本,您可以清楚地看到 $.connection 对象上存在的成员,这应该可以为您提供有关问题所在的线索。
    【解决方案3】:

    检查您的global.asax 文件,如果那里存在routes.Clear(); 行,请删除该行,因为它会清除信号路径。

    【讨论】:

      【解决方案4】:

      确保您引用的是 jquery 1.6.4

      【讨论】:

      • Pranav,这并不是一个足够完整的答案。您能否尝试改进它以对 OP 更有帮助?
      • 我正在引用 jquery 1.7.1(通过包含 Kendo 的东西)。此页面也适用于不同的 SignalR 集线器,并且未对 javascript 包含进行任何更改。
      • 这与 jQuery 无关。请参阅下面的答案
      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多