【问题标题】:SignalR - unable to call server method from external JavaScript clientSignalR - 无法从外部 JavaScript 客户端调用服务器方法
【发布时间】:2016-02-18 11:30:05
【问题描述】:

我正在学习 SignalR。使用教程,我设法创建了一个非常简单的基于 ASP.NET MVC 的 SignalR 服务器。这是集线器的代码:

[HubName("echo")]
public class EchoHub : Hub
{
    public void Say(string message)
    {
        Trace.WriteLine(message);
    }
}

这是我的启动文件:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true
            };
            map.RunSignalR(hubConfiguration);
        });
    }
}

接下来我创建了一个基于 HTML/JavaScript 的客户端,它与服务器代码在同一个项目中。此客户端工作正常,当我调试应用程序时,输出窗口会显示我的消息。这是第一个客户的代码:

<script src="../Scripts/jquery-1.10.2.min.js"></script>
<script src="../Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="/signalr/hubs"></script>
<script>
        $(function() {
            var hubProxy = $.connection.echo;
            $.connection.hub.logging = true;

            $.connection.hub
                .start()
                .done(function () {
                    hubProxy.server.say('Hello SignalR');
                });
        })
</script>

我想做的最后一件事是在单独的项目中创建一个客户端。我更改了一点代码,主要是通过添加服务器的 url。但是这个客户端不能正常工作。这是客户端的代码:

<script src="Scripts/jquery-1.6.4.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:51644/signalr/hubs"></script>
<script>
    $(function() {
        $.connection.hub.url = 'http://localhost:51644/signalr';
        var hubProxy = $.connection.echo;
        $.connection.hub.logging = true;

        $.connection.hub
            .start()
            .done(function () {
                hubProxy.server.say('Hello SignalR');
            });
    })
 </script>

启动连接后,JavaScript 甚至不会在 done 方法中输入函数。但在 Chrome 的控制台中,没有抛出任何错误或异常。

所以问题是我在第二个客户端做错了什么?

编辑:我在 Chrome 控制台中启用并检查了 SignalR 客户端日志。第二个客户端停止步骤“SignalR:与'/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%5D'协商”。没有返回任何错误,一切看起来都很好,但是客户端无法通过这一步。

EDIT2:根据 JF Beaulieu 的评论,协商返回 200 状态码,但没有别的。在协商之后应该有接下来的步骤,比如调用 Say,但在外部客户端挂起协商。我在此处粘贴来自内置和外部 JavaScript 客户端的控制台输出。

构建客户端输出:

外部客户端输出:

第二个屏幕截图显示,客户端停止执行协商步骤。

我也尝试过Mareq的解决方案,但是添加jsonp属性并没有帮助。

EDIT3:我在这里添加了一个指向我的 Github 存储库的链接,该项目的服务器位于 AspNetServer 项目中,客户端位于 JavaScriptClient 项目中,希望对您有所帮助: https://github.com/RomanSuska/SignalRSandbox

【问题讨论】:

  • 如果你访问http://localhost:51644/signalr/hubs,你会看到一些生成的javascript吗?
  • @JFBeaulieu 是的,我看到生成的 JavaScript 代码,来自第一个和第二个客户端的文件是相等的。
  • 您使用什么传输方式连接?你能在开发工具的网络选项卡中看到200 OK 用于协商...消息吗?
  • 我已更新问题以回答您的评论。

标签: asp.net signalr


【解决方案1】:

我终于找到了我的问题的解决方案,这很简单。问题出在 SignalR JavaScript 文件版本上,在服务器上我使用了 SignalR 2.1.2 版本,在客户端上我使用了 2.2.0。当我将客户端版本切换到 2.1.2 时,一切都开始工作了。

【讨论】:

    【解决方案2】:

    我的情况是因为我的 Hub 有一个构造函数,因为我试图用 Unity 进行依赖注入。删除构造函数后,一切正常。

    【讨论】:

    • 我已经为此烦恼很久了。这也正是我的问题!知道在这种情况下如何实施 DI 吗?
    • 好像你没有。还没想通在需要这个的项目之后我还没有接触过 C#,所以我不确定它是否可能 xD
    • 最后我设法按照这篇文章damienbod.com/2013/11/05/using-signalr-with-unity
    【解决方案3】:

    将此参数添加到start

    $.connection.hub.start({ jsonp: true });
    

    编辑我在控制台应用中托管了 SignalR,并使用了简单的设置配置:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR(new HubConfiguration { EnableJSONP = true });
        }
    }
    

    和我这样使用的客户端代码:

    $(function () {
            var hub = $.connection.serviceHub;
            $.connection.hub.url = 'http://mareq.ddns.net:8087/signalr';
    
            $.connection.hub.start({ jsonp: true });
    
            ...
        });
    

    【讨论】:

    • 如果您解释了此更改的作用,这将是一个更好的答案。 jsonp的目的是什么?
    • 这并没有解决问题,客户端 JavaScript 仍然挂在协商步骤中
    • 根据您的更新,我已经在像您这样的控制台应用程序上进行了尝试,它工作正常,但是如果我制作一个 ASP.NET MVC 服务器(具有相同的集线器和启动代码),客户端无法连接。你能尝试做一个MVC服务器吗?
    • mareq.pl - 服务器 [以前的集线器代码] mareq.tk - 客户端 [可以预览的js]
    • 我设法找到了解决方案,感谢您的帮助,您的项目对找到解决方案很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多