【问题标题】:SignalR across domains: errors with not allowed by Access-Control-Allow-OriginSignalR 跨域:Access-Control-Allow-Origin 不允许的错误
【发布时间】:2013-02-17 02:19:17
【问题描述】:

尝试从另一个域调用 signalR,并不断收到此错误:

XMLHttpRequest 无法加载 本地主机:62150/signalr/negotiate?_=1362242757692。起源 Access-Control-Allow-Origin 不允许 localhost:4982。

这是我要运行的代码:

$(function () {
    jQuery.support.cors = true;
    $.connection.hub.url = 'http://localhost:62150/signalr';
    $.connection.hub.start()
        .done(function () { alert("Now connected!"); })
        .fail(function () { alert("Could not Connect!"); });
});

jquery 和 jquery.signalr.js 已加载,localhost:62150/signalr/hubs 以 JS 响应,如果我在浏览器中运行,localhost:62150/signalr/hubs/negotiate?_=1362243021215 返回 JSON - 所以它不是缺少脚本或无效路径问题。

我尝试过的:

以及以上所有内容的组合。

有人知道我还能尝试什么吗?

服务应用是 MVC 和 WebAPI 的组合(不要认为它有任何区别)。 如果我尝试来自同一域的代码 - 它可以工作。

【问题讨论】:

  • 你用什么浏览器来测试这个?是否支持 CORS?
  • 铬。我可以通过 ajax 对 Web Api 进行跨域调用,所以是的。

标签: asp.net-mvc asp.net-web-api signalr


【解决方案1】:

如果您使用的是 1.0 或更高版本,您是否在服务器上启用了跨域? (现在默认禁用)

RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });

【讨论】:

  • 以前的版本是预发布版本,SignalR 1.0 是第一个 RTM 版本,所以这不是一个重大变化 ;-)
  • FWIW 在“1.0 Breaking Changes”下的发行说明中突出提到了此更改。 github.com/SignalR/SignalR/blob/master/ReleaseNotes.md 是在每个版本中查找更改的最佳位置。
  • 即使我有这行代码,我也得到了上面的错误。如果我改用 RouteTable.Routes.MapHubs(),我会得到 304。我的代码适用于 IE10 和 FF 20,但不适用于 Chrome 25.0.1364.172。有什么想法吗?
  • 我得到这个输出: ...\Global.asax.cs(17,64,17,81): error CS0117: 'Microsoft.AspNet.SignalR.HubConfiguration' 不包含定义'EnableCrossDomain' ...\Global.asax.cs(17,13,17,91): 错误 CS0619: 'System.Web.Routing.SignalRRouteExtensions.MapHubs(System.Web.Routing.RouteCollection, Microsoft.AspNet.SignalR. HubConfiguration)' 已过时:'在 Owin Startup 类中使用 IAppBuilder.MapSignalR。有关详细信息,请参阅go.microsoft.com/fwlink/?LinkId=320578。'
【解决方案2】:

在浪费了几个小时之后,我认为分享我的经验是件好事:

  1. 不要将 Access-Control-Allow-Origin 添加到您的 web.config 中(是的,它永远不会添加它,但是在尝试事情时,这实际上是我第一次这样做并离开了经过简单的jquery跨域访问测试后就在那里)

  2. RouteTable.Routes.MapHubs( new HubConfiguration() { EnableCrossDomain = true } ); 适用于继承 Hub 的类

  3. RouteTable.Routes.MapConnection<MyConnection>( "foo", "/foo", new ConnectionConfiguration { EnableCrossDomain = true } ); 这对于继承 PersistentConnection 的类也很有效

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2018-11-29
    • 2015-06-17
    • 2013-09-09
    • 2012-03-08
    • 2012-08-10
    • 2016-06-30
    相关资源
    最近更新 更多