注 :最初是他人问过这个问题,但删除了它之前,我可以张贴我的答案。 由于这个问题涉及开发商试图让SignalR工作跨域时面临很多问题,我决定去复制它。 另外,我已经写完了答案!
我跑在ASP.NET MVC的.NET Framework 4项目SignalR 1.0.1服务器。 我有一个不同的域(不同的本地主机端口)尝试通过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>
我使用的是PersistentConnection我SignalR服务器,而不是集线器。
有任何想法吗?
MapHubs
将配置在/ signalr端点与您的沟通所有Hub
类。 由于不使用集线器,调用MapHubs
是不必要的。 要将呼叫MapHubs
也不会对你的/ API接口的配置没有任何影响。
您对MapConnection呼叫应改为如下:
RouteTable.Routes.MapConnection<ApiConnection>("api", "api",
new ConnectionConfiguration { EnableCrossDomain = true });
注:第二个参数MapConnection
是URL。 第一个参数是路由名。 的/
是不必要的,但并没有真正伤害任何一种情况下。
设置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 () { /* ... */ });
我要重申,SignalR将自动回落到JSONP如果环境不支持CORS,所以你不应该指定自己这个选项。 JSONP不需要Access-Control-Allow-Origin
头,但它确实迫使SignalR使用其最没有效率的运输:长轮询。
你并不需要设置customHeaders
在你的web.config。 SignalR将设置Access-Control-Allow-Origin
,当你设置自动SignalR响应头EnableCrossDomain
在你真正ConnectionConfiguration
。
参考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections用于抵用更多的建议PersistentConnections
。