注意:其他人最初问过这个问题,但在我发布回答之前将其删除了。由于这个问题涵盖了开发人员在尝试使SignalR跨域工作时遇到的许多问题,因此我决定复制它。另外,我已经写完答案了!
我正在ASP.NET MVC .NET Framework 4项目中运行SignalR 1.0.1服务器。我在另一个域(不同的localhost端口)上尝试通过JavaScript客户端连接另一个ASP.NET应用程序。当我的应用程序尝试连接时,我得到了这个:
XMLHttpRequest cannot load http://localhost:31865/api/negotiate?_=1363105027533.
Origin http://localhost:64296 is not allowed by Access-Control-Allow-Origin.
我已按照所有步骤启用SignalR的跨域支持 - 我缺少什么?
jQuery.support.cors = true;
$.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
RouteTable.Routes.MapConnection<ApiConnection>("/api", "api");
我还在API项目的Web.config中添加了以下内容:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
我正在为我的SignalR服务器使用PersistentConnection,而不是集线器。
有什么想法吗?
答案 0 :(得分:16)
MapHubs
将在/ signalr处配置端点,以便与您的所有Hub
类进行通信。由于您未使用集线器,因此无需调用MapHubs
。对MapHubs
的调用也不会对/ api连接的配置产生任何影响。
您对MapConnection的调用应更改为如下所示:
RouteTable.Routes.MapConnection<ApiConnection>("api", "api",
new ConnectionConfiguration { EnableCrossDomain = true });
注意: MapConnection
的第二个参数是网址。第一个参数是路径名称。 /
是不必要的,但在任何一种情况下都不会造成伤害。
设置jQuery.support.cors = true;
应仅完成“要在不支持cors但允许跨域XHR请求的环境中启用跨域请求(Windows小工具,等)“[1]
。这与IE的任何版本或我所知道的任何其他浏览器无关。如果浏览器不支持CORS,则SignalR将自动回退到JSONP ,除非您将jQuery.support.cors
设置为true。
如果你盲目地将其设置为true,SignalR将假设环境确实支持跨域XHR请求,并且不自动回退到JSONP呈现SignalR无法在运行时建立跨域连接在真正不支持CORS的浏览器中。
$.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
不正确。你应该只需要
var connection = $.connection('http://localhost:31865/api');
xdomain
不再是SignalR JS客户端的选项,如果确实要指定jsonp
,则应在start
时执行此操作像这样的连接:
connection.start({ jsonp: true}).done(function () { /* ... */ });
我应该重申,如果环境不支持CORS,SignalR将自动回退到JSONP,因此不应自己指定此选项。 JSONP不需要Access-Control-Allow-Origin
标头,但它确实迫使SignalR使用其效率最低的传输:长轮询。
您无需在Web.config中设置customHeaders
。当您在Access-Control-Allow-Origin
中将EnableCrossDomain
设置为true时,SignalR会自动在SignalR响应中设置ConnectionConfiguration
标头。
参考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections以获取有关使用PersistentConnections
的更多建议。