【问题标题】:How to use SignalR with cross domain如何在跨域中使用 SignalR
【发布时间】:2017-09-22 09:43:14
【问题描述】:

我正在尝试将 SignalR 与跨域一起使用,但在调用启动函数时收到错误消息。错误信息是"Uncaught TypeError: Cannot call method 'start' of undefined "

我正在使用代码 服务器端:

[assembly: OwinStartup(typeof(SignalRChat.Startup))]

    namespace SignalRChat
    {
        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);
                });
            }
        }
    }

客户端代码。

 <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script src="/Scripts/jquery-1.6.4.min.js"></script>   
        <script src="/Scripts/jquery.signalR-1.1.4.min.js"></script>
    </head>
    <body>
       <div></div>
       <script type="text/javascript">
        var connection = $.connection.hub.url ='http://localhost:9370/signalr';      
        connection.hub.start()
          .done(function () {
              alert('Now connected, connection ID=' + connection.id);
          });
      </script>
      </body>
      </html>

【问题讨论】:

    标签: javascript signalr


    【解决方案1】:

    Signalr 连接的初始化和启动存在问题,还要声明一个代理来引用集线器。见下例:

    <script src="/Scripts/jquery-1.6.4.min.js"></script>   
    <script src="/Scripts/jquery.signalR-1.1.4.min.js"></script>
    <script src="http://localhost:9370/signalr/hubs"></script>
    
     <script type="text/javascript">
        $.connection.hub.url ='http://localhost:9370/signalr';
        var yourHubProxy = $.connection.YourHubName;
    
        //Do something here with yourHubProxy
    
        $.connection.hub.start().done(function () {
            alert('Now connected, connection ID=' + $.connection.hub.id);
         });
     </script>
    

    另一件事,我不确定您为什么在服务器端和客户端使用不同版本的SignalR。对我来说,你的服务器端有SignalR 2.x,而你的cient 端有SignalR 1.1.4

    看看下面的链接,这是一个关于 SignalR 跨域的很好的例子。 http://damienbod.wordpress.com/2013/11/01/signalr-messaging-with-console-server-and-client-web-client-wpf-client/

    【讨论】:

      【解决方案2】:

      @Lin 已经回答了这个问题,但我想告知与跨域连接相关的一个重要点。

      大多数情况下,当您搜索此问题时,我们通常会使用 localhost 查找所有示例,例如:http://localhost:9370

      由于您仅绑定到 localhost,因此如果您尝试从其他地址(例如 http://dev-domain:9370/signalr/hubs 远程访问)将无法正常工作,您将收到 HTTP 错误 400,即请求主机名无效。

      为了绑定机器上的所有地址,我们必须像这样使用它 http://*:8097

      如果有人在此之后发现问题,请检查防火墙:)

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 2013-06-24
        • 2014-09-08
        • 2013-02-28
        相关资源
        最近更新 更多