Chrome中SignalR和跨域请求的问题27

Ben*_*esh 6 asp.net-mvc iis-7 cross-domain signalr

编辑:这显然只是Chrome中的一个问题,它在FF和IE中运行良好

Chrome版本:27.0.1453.116

我在localhost:13371上有一个简单的JS/HTML站点,我正在尝试访问localhost:13371上的SignalR中心.

无论何时发出请求,我都会收到以下错误:

XMLHttpRequest无法加载http://localhost:13370/signalr/hubs/negotiate?_=1372338722032.原产地http://localhost:13371不被访问控制允许来源允许的.

我已经尝试过了:

  • 在SignalR上启用跨域Application_Start:

    RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
    
    Run Code Online (Sandbox Code Playgroud)
  • 在SignalR服务器的Web.Config中启用跨域:

    <system.webServer>
       <httpProtocol>
         <customHeaders>
           <clear />
           <add name="Access-Control-Allow-Origin" value="*" />
           <add name="Access-Control-Allow-Methods" value="*" />
           <add name="Access-Control-Allow-Headers" value="*" />
         </customHeaders>
       </httpProtocol>
    </system.webServer>
    
    Run Code Online (Sandbox Code Playgroud)
  • 在JavaScript中设置信号器中心的连接URL:

    $.connection.hub.url = 'http://localhost:13370/signalr/hubs';
    
    Run Code Online (Sandbox Code Playgroud)
  • 在jQuery中启用CORS:

    $.support.cors = true;
    
    Run Code Online (Sandbox Code Playgroud)
  • 手动设置响应头Application_BeginRequest:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

以上都没有,也没有上述任何组合起作用.

附加信息:

  • 两个站点都在Windows 7上的IIS中运行
  • SignalR站点在端口13370上运行,作为.NET 4.0下的MVC 4站点的一部分.
  • JS/HTML站点是端口13371上的简单Web服务器,根本没有托管代码.
  • SignalR站点肯定会响应浏览器对相关资源的直接请求.
  • SignalR版本是1.1.2

Ben*_*esh 5

编辑:我现在已经找到了两个解决方案...

方法1.摆脱您可能不需要的废话:

正如我在“ 堆栈溢出”问题中发现的那样,基本上几乎不需要在上面的“我尝试过的事情”清单中添加的所有内容。解决步骤:

  1. 删除上面列出的所有内容。这意味着根本没有在Web.Config或Global.asax等其他地方指定任何自定义标头,也没有自定义jquery设置等。

  2. ..除了RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });Application_Start

  3. 另外,您仍然需要设置 $.connection.hub.url = 'http://localhost:13370/signalr/hubs';

... 而已。 这可能是最好的解决方案,我最终使用了它。

方法2.如果您在Chrome中仍然遇到问题,请使用jsonp:

如果您在Chrome中仍然遇到此类问题,则可以使用jsonp获取该协商脚本以正确下载...将以下内容添加到我的JavaScript集线器中即可解决此问题:

//detect chrome
var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

//set the connection url.
$.connection.hub.url = 'http://localhost:13370/signalr/hubs';

//use jsonp if chrome
$.connection.hub.start({
    jsonp: isChrome
});
Run Code Online (Sandbox Code Playgroud)

可能有一种更好的方法来执行此操作,以测试浏览器功能并相应地设置jsonp ...看着用户代理感觉像地狱一样脏...但这暂时解决了我的问题。我希望这可以帮助其他人。