【问题标题】:How do I get a SignalR hub connection to work cross-domain?如何让 SignalR 集线器连接跨域工作?
【发布时间】:2013-05-28 08:01:11
【问题描述】:

我正在尝试让一个超级简单的集线器连接跨域工作,但没有运气。我已经阅读了几十篇文章并完成了所有提到的事情,但仍然没有成功。

我的服务器集线器在这里

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.broadcastMessage(name, message);
    }
}

我的服务器 MapHubs 调用在这里

RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });

我的任何 javascript 客户端都在这里

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/jquery-2.0.1.min.js"></script>
    <script src="~/Scripts/jquery.signalR-1.1.2.min.js"></script>
    <script src="/signalr/hubs"></script>
</head>
<body>
    <div class="container">
        <input type="text" id="displayname" value="Test" />
        <input type="text" id="message" value="I'm here" />
        <input type="button" id="sendmessage" value="Send" />
    </div>
    <script type="text/javascript">
        $(function ()
        {
            $.connection.hub.url = 'http://<my url>/';
            var chat = $.connection.chatHub;
            alert(chat);
            $.connection.hub.start().done(function ()
            {
                alert("Connection succeeded");
            }).fail(function ()
            {
                alert("Connection failed");
            });
        });
    </script>
</body>
</html>

问题是它永远不会到达连接成功或失败的警报,并且警报(聊天)调用返回未定义。

我已经为 $.connection.hub.url 行尝试了几种组合

$.connection.hub.url = 'http://<My url>';
$.connection.hub.url = 'http://<My url>/';
$.connection.hub.url = 'http://<My url>/signalr';
$.connection.hub.url = 'http://<My url>/signalr/';

Chrome 和 Firebug 中的开发者控制台显示错误

Uncaught Error: SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/hubs'></script>. 

在同一个域上它工作正常。这真的让我发疯了,所以任何帮助都将不胜感激。

谢谢, 杰森

【问题讨论】:

    标签: javascript cross-domain signalr


    【解决方案1】:

    您的服务器正在跨域托管,但您正尝试从当前域获取集线器。因此,它无法检索 hubs 文件,并且您实际上没有可以使用的代理(这就是为什么一切都无法正常工作的原因)。

    所以你有两个选择:

    1. 手动创建 hubs 文件并将其托管在当前域:http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#manualproxy
    2. 使用原始集线器连接 API,并且根本不包含 signalr/hubs 文件。

    下面是如何使用原始集线器连接 API 的代码 sn-p:http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#nogenconnection(第二个代码 sn-p)。

    【讨论】:

    • 太棒了,谢谢!我实际上曾尝试使用手动代理方法 (2) 并没有运气,但当时我一定有其他问题。我再次尝试并让它工作。现在让它在 PhoneGap 上运行,但这是另一天的挑战。
    • @Jason - phonegap 和 signalr 运气好吗?想在下周破解这个,如果听到其他人让它工作会很有帮助
    • @DeeMac - 我们最终没有继续这个项目(客户资金问题),所以我还没有真正做更多的事情。从我所见,自从我上次使用 SignalR 以来,它已经发展了很多。不过玩得开心,这是一项非常酷的技术。
    • @Jason - 没问题,非常感谢您的回复。其实很酷,我很享受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多