【问题标题】:Signalr Test Project Not Working As ExpectedSignalr 测试项目未按预期工作
【发布时间】:2017-02-08 08:34:22
【问题描述】:

我正在尝试创建一个简单的 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 控制台窗口中得到以下输出:

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 脚本!

【问题讨论】:

  • 一个简单的问题,这两个代码都在同一个项目或两个不同的项目中,因为 IMO 一个似乎是基于控制台的应用程序,另一个是基于 Web 的。这是正确的吗?
  • 是的 - 单独的应用程序。用于发送消息的控制台应用程序和用于显示消息的 Web 应用程序
  • 我认为 CORS 仅在您跨域时才相关?
  • @Tester 在他的评论中已经提到启用 CORS,这样您就可以将消息从控制台应用程序发送到 Web 应用程序。由于您处于开发阶段并且项目具有不同的端口号,因此您必须在当前应用程序中实现 CORS。如果您打算将它们托管在单个域中(我假设您会这样做),则不需要 CORS 继续您的工作并在 LIVE 站点上对其进行测试。

标签: c# asp.net-mvc signalr signalr-hub


【解决方案1】:

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

$.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. 不要这样调用start:hub.start();这样调用:$.connection.hub.start();
  2. 您可能想要升级到最新版本的 jquery。
  3. 确保您在 SignalRTest.js 上方引用 jquery - 这就是为什么您会收到上面的“无法读取未定义的属性”错误。

【讨论】:

  • 看起来,虽然这可能是正确的,但它并不是全部答案(仍然没有收到警报)。
  • 好的,再次查看您的代码,我看到了:public void Hello(string message) and hub.client.Hello = function (name, message) { 所以...你不是使用第一个字符串消息 - 你没有通过它。在前端脚本中,您还有一个额外的名称参数。检查我更新的答案。参数必须匹配。
  • 试过了。我什至尝试过使用方法(Hello/hello)的情况,但没有骰子。
  • @pm_2 是的,正如上面提到的评论者 - 您可能还需要启用 cors。在我的解决方案中,我将集线器放在一个类库中,然后由我的具有 FE js 的 Web 项目引用。您也可以尝试这样做。
  • 我尝试启用 CORS(如上所述)。抱歉,我不确定“FE js”是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多