如何使用SignalR与跨域

时间:2014-01-30 06:52:28

标签: javascript signalr

我正在尝试使用带有跨域的SignalR但是在调用start函数时我收到错误消息。错误讯息为"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>

2 个答案:

答案 0 :(得分:10)

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和客户端SignalR 1.1.4

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

答案 1 :(得分:0)

@Lin已经回答了这个问题,但我想告知一个与CROSS DOMAIN连接相关的重要事项。

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

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

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

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