6

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

铬版本:27.0.1453.116

我在 localhost:13371 上有一个简单的 JS/HTML 站点,我正在尝试访问位于 localhost:13371 的 SignalR 集线器。

每当发出请求时,我都会收到以下错误:

XMLHttpRequest 无法加载http://localhost:13370/signalr/hubs/negotiate?_=1372338722032。Access-Control-Allow- Originhttp://localhost:13371不允许 Origin。

我已经尝试过的:

  • 在 SignalR 上启用跨域Application_Start

    RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
    
  • 在 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>
    
  • 在 JavaScript 中的信号器集线器上设置连接 url:

    $.connection.hub.url = 'http://localhost:13370/signalr/hubs';
    
  • 在 jQuery 中启用 CORS:

    $.support.cors = true;
    
  • 手动设置响应头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();
        }
    }
    

以上均无效,也没有任何组合有效。

附加信息:

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

5 回答 5

5

编辑:我现在找到了两种解决方案......

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

正如我在这个Stack Overflow question中发现的那样,基本上我在上面的“我尝试过的事情”列表中添加的几乎所有内容都是不必要的。修复步骤:

  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
});

可能有更好的方法来测试浏览器功能并相应地设置 jsonp ......看着用户代理感觉很脏......但这在此期间解决了我的问题。我希望这对其他人有帮助。

于 2013-06-27T15:13:58.880 回答
1

这对我有用。将此方法放在 Global.asax.cs

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
    var referrer = Request.UrlReferrer;
    if (Context.Request.Path.Contains("signalr/") && referrer != null)
    {
        Context.Response.AppendHeader("Access-Control-Allow-Origin", referrer.Scheme + "://" + referrer.Authority);
    }
}
于 2014-02-03T16:47:21.947 回答
1

我在我的 MVC6 SignarR 服务器中遇到了同样的问题。刚刚安装Install-Package Microsoft.Owin.Cors包管理器控制台中并添加 app.UseCors(CorsOptions.AllowAll)到 Startup.cs。

于 2017-06-14T15:30:12.027 回答
0

它在文档中,但永远不要这样做:

$.support.cors = 真;

于 2013-07-17T17:22:02.067 回答
0

对我有用的是以下。

protected void Application_Start(object sender, EventArgs e)
    {
        var config = new HubConfiguration
        {
            EnableCrossDomain = true
        };
        RouteTable.Routes.MapHubs(config);
    }
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (this.Context.Request.Path.Contains("signalr/"))
        {
            this.Context.Response.AddHeader("Access-Control-Allow-Headers", "accept,origin,authorization,content-type");
        }
    }
于 2013-11-12T16:26:18.563 回答