gpt4 book ai didi

asp.net-mvc - Chrome 27 中的 SignalR 和跨域请求问题

转载 作者:行者123 更新时间:2023-12-03 03:29:03 24 4
gpt4 key购买 nike

编辑:这显然只是 Chrome 中的问题,在 FF 和 IE 中工作正常

Chrome 版本:27.0.1453.116

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

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

XMLHttpRequest cannot load http://localhost:13370/signalr/hubs/negotiate?_=1372338722032. Origin http://localhost:13371 is not allowed by Access-Control-Allow-Origin.

我已经尝试过:

  • Application_Start 上启用 SignalR 跨域:

    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 中手动设置响应 header :

    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

最佳答案

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

方法 1. 摆脱你可能不需要的垃圾:

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

  1. 删除我上面列出的所有尝试过的内容。这意味着在 Web.Config 或 Global.asax 等其他地方根本没有指定自定义 header ,也没有自定义 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 hub start 解决了该问题:

//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...查看用户代理感觉很脏...但这暂时解决了我的问题。我希望这对其他人有帮助。

关于asp.net-mvc - Chrome 27 中的 SignalR 和跨域请求问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17344495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com