如何通过SignalR使用跨域连接(CORS - 访问控制允许来源)
使用持久连接和ASP.NET JavaScript客户端,我试图连接到与页面不同的子域从服务。如何通过SignalR使用跨域连接(CORS - 访问控制允许来源)
ASP.Net从网络服务器sub1.mydomain.com
的页面想要连接到SignalR在sub2.mydomain.com
。在相同的子域内连接时,相同的代码工作正常。
我发现了另一个帖子里跨域连接被启用:
jQuery.support.cors = true;
但这并没有为我工作。
如何使用持续连接和JavaScript客户端连接到第二个子域中的SignalR?
你需要做以下操作之一,使其工作:
- 设置
$.connection.hub.url = 'http://subdomain.domain.com/signalr';
,指向你的子域。 -
在服务器上启用跨域:
RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true });
var connection = $.connection('http://somecrossdomainurl/echo')
connection.start({ transport: 'longPolling', xdomain: true });
如果从0.5.1到0.5.2的切换,你可能有以下几点:
$.connection.hub.start({ transport: 'longPolling', xdomain: true }, function() {...
可以更改为:
$.connection.hub.start({ jsonp: true }, function() {...
真正解决了我的问题是:
1 - 添加这Global.asax中:
RouteTable.Routes.MapHubs(new HubConfiguration() {
EnableCrossDomain = true
});
2 - 设置我的Web项目,使的Web.config跨域:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> </customHeaders> </httpProtocol> </system.webServer>
3-然后我改变我的html的实施,改变了$■连接()来如下:
var connection = $.hubConnection('http://localhost.my:8081/signalr'); var chatHubProxy = connection.createHubProxy('chatHub');
版本我使用的是:
signalR-1.1 0.0
jquery.signalR-1.1.3.js
dot.net 4。0
我正在使用4个子域名,我是否应该在每个子域名上托管我的集线器类,还是应该在所有子域名上托管我的完整网站,包括我拥有的网页? – 2014-09-11 06:04:18
RouteTable.Routes.MapHubs(config);已弃用; CORS现在默认启用每个http://weblogs.asp.net/davidfowler/signalr-0-5-1-released – 2015-03-31 03:03:53
在SignalR的当前版本,使用现在独立CORS包,这样做的API已更改为:
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
};
map.RunSignalR(hubConfiguration);
});
}
感谢您指出这一点:) – 2016-07-16 13:25:33
你还需要添加'使用Microsoft.Owin。 Cors;'(以及安装相应的NuGet包),如果你还没有。 – 2016-11-05 00:46:23
我试过第一个和第三个项目符号,但我使用的是持续连接,所以第二个项目符号不适用。仍然无法连接。 – codezoo 2012-04-03 23:42:22
@codezoo对于持久连接,您还可以指定一个url,例如。 'var con = $ .connection('echo'); con.url = http:// my.domain.com/echo.'在这里指定完整的URL:'。.connection('http://my.domain.com/echo')'也应该工作,虽然我避难没有检查。 – 2012-04-04 05:29:47
感谢Piotr,我目前使用这个方法:$ .connection('http://my.domain.com/echo') – codezoo 2012-04-04 10:58:44