Signalr 测试项目未按预期工作

Signalr Test Project Not Working As Expected

我正在尝试创建一个简单的 SignalR 测试项目;但是,它并没有按照我认为应该的方式运行。我有一个包含以下代码的网站:

namespace SignalRTest3
{    
    public class MyHub1 : Hub
    {
        public void Hello(string message)
        {
            Clients.All.Hello();
            
        }
    }
}

Startup.cs:

[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))]
namespace SignalRTest3
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);

            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
}

我已经更改了索引页:

<body>
    <!-- HTML Content -->

    <script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
    <script type="text/javascript" src="~/signalr/hubs"></script>
    <script type="text/javascript" src="~/Scripts/SignalRTest.js"></script>
    <div class="jumbotron">
        <h1>SignalR Test</h1>
    </div>
</body>

而上面引用的JS文件是:

$(function () {
    // Declare a proxy to reference the hub. 
    var hub = $.connection.MyHub1;

    // Create a function that the hub can call to broadcast messages.
    hub.client.Hello = function (message) {

        alert(message);
    };

    hub.start();
});

因此,本意是当收到通知时,网站将显示警报。要触发它,我有一个控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Message: ");
        string message = Console.ReadLine();

        HubConnection connection = new HubConnection("http://localhost:4035/");
        IHubProxy hub = connection.CreateHubProxy("MyHub1");
        connection.Start().Wait();
        hub.Invoke<string>("Hello", message).Wait();            
    }
}

所以我输入了一条消息,可以看到集线器中的代码触发了,但是 javascript 和集线器之间的接线似乎有问题;请有人能指出我正确的方向吗?

编辑:根据 JPThorne 的建议更改方法签名和 hub.start

编辑:尝试使用 CORS,但无济于事

看起来问题可能出在代理上;我在 F12 控制台中得到以下输出 window:

Uncaught TypeError: Cannot read property 'MyHub1' of undefined
    at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3)
    at c (jquery-1.10.2.min.js:21)
    at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21)
    at Function.ready (jquery-1.10.2.min.js:21)
    at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21

更新:

感谢JPThorne的帮助,我终于找到了BundleConfig文件;我的看起来像这样:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
            "~/Scripts/jquery-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
            "~/Scripts/jquery.validate*"));
// Use the development version of Modernizr to develop with and learn from. Then, when you're
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
            "~/Scripts/modernizr-*"));

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
          "~/Scripts/bootstrap.js",
          "~/Scripts/respond.js"));

bundles.Add(new StyleBundle("~/Content/css").Include(
          "~/Content/bootstrap.css",
          "~/Content/site.css"));

据我所知,~/Scripts/jquery-{version}.js 上用于 {version} 的正则表达式也过早地选择了 SignalR 脚本!

您还需要在客户端启动集线器。嗯,这对我们有用。你可以试试这个:

$.connection.hub
    .start()
    .done(function() { console.log("Hub started"); })
    .fail(function() { console.log("Error: could not connect"); });

此外,我发现以下侦听器非常方便:

$.connection.hub.connectionSlow(function() {
    console.log("We are currently experiencing difficulties with the connection.");
});

$.connection.hub.error(function (error) {
    console.log("SignalR error: ", error);
});

更新 #1: 我会将您服务器上的 Clients.All.hello(); 更改为 Clients.All.hello(message);

然后在 FE 上将 hub.client.Hello = function (name, message) 更改为 hub.client.Hello = function (message)

更新#2: 添加 : [HubName("MyHub1")] 以上 public class MyHub1 : Hub

更新 #3:

好的,我试过你的版本,实际上有一些问题。

  1. 不要这样调用开始:hub.start();这样调用:$.connection.hub.start();
  2. 您可能想要升级到最新版本的 jquery。
  3. 确保您在 SignalRTest.js 上方引用 jquery - 这就是为什么您在上方出现 'cannot read property of undefined' 错误的原因。