0

我正在尝试在我的 MVC4 应用程序中设置 SignalR。

问题是 - 即使当我浏览到路径 /signalr/hubs 我确实看到了代码(并且 fiddler 为 /signalr/hubs 显示 200OK),它似乎不包含对我的集线器和客户端代码的任何引用也没有请参阅集线器和方法。

开始调试时出现这些错误(IIS Express、VS Express 2012):

对象没有方法发送 无法设置未定义的属性“messageAll”

Global.asax 中的 Application_Start 包含:

        //RouteTable.Routes.MapHubs("/signalr", new HubConfiguration());
        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

(我假设这会生成 /signalr/hubs,这似乎有效,但没有任何链接到我的实际集线器。可以看出我尝试了这两个选项)。

在我的项目中,我在根目录中使用 MessageHub.cs 获得了文件夹“Hubs”:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace Prj.Hubs 
{
[HubName("messagehub")]
public class MessageHub : Hub
{
    public void MessageAll(string message)
    {
        Clients.All.writeMessage(message);
    }

    public void MessageOthers(string message)
    {
        Clients.Others.writeMessage(message);
    }

    public void MessageSingle(string message)
    {
        
    }
}

}

在我的 _Layout.cshtml 中,我在结束标记之前:

<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
    <script type="text/javascript" src="~/Scripts/jquery.signalR-1.1.2.js"></script>
    <script src="/signalr/hubs" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {

            // create proxy on the fly
            var proxy = $.connection.messagehub; // this connects to our 'messageHub' Hub as above

            // for SignalR to call the client side function we need to declare it with the Hub
            proxy.messageAll = function (message) {
                $('#messages').append('<li>' + message + ''); // when the Hub calls this function it appends a new li item with the text 
            };

            // declare function to be called when button is clicked 
            $("#broadcast").click(function () {
                // calls method on Hub and pass through text from textbox 
                proxy.messageAll($("#message").val());
            });

            // Start the connection 
            $.connection.hub.start();
        });
    </script>

(旁注 - SignalR 根本不喜欢 @Scripts.Render("~/bundles/jquery"),但直接包含 jquery 脚本似乎可以工作)。

那么为什么它不能准确识别“messagehub”呢?

4

1 回答 1

1

我解决了这个问题 - 我的解决方案包含多个项目,虽然我已经卸载了 SignalR,但在 bin/Debug 文件夹中的一些项目中,仍然存在我几个月前尝试过的旧 SignalR 版本的痕迹。

在运行时,SignalR 试图将一些旧的 dll 与新的引用连接起来。所以如果你有这个错误那么

  • 卸载 SignalR
  • 在整个解决方案文件夹中搜索“SignalR”并删除所有内容
  • 从 Nuget 包管理器重新安装 SignalR。
于 2013-06-02T17:26:08.877 回答