Ben*_*esh 6 asp.net-mvc iis-7 cross-domain signalr
编辑:这显然只是Chrome中的一个问题,它在FF和IE中运行良好
Chrome版本:27.0.1453.116
我在localhost:13371上有一个简单的JS/HTML站点,我正在尝试访问localhost:13371上的SignalR中心.
无论何时发出请求,我都会收到以下错误:
XMLHttpRequest无法加载
http://localhost:13370/signalr/hubs/negotiate?_=1372338722032.原产地http://localhost:13371不被访问控制允许来源允许的.
在SignalR上启用跨域Application_Start:
RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
Run Code Online (Sandbox Code Playgroud)在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>
Run Code Online (Sandbox Code Playgroud)在JavaScript中设置信号器中心的连接URL:
$.connection.hub.url = 'http://localhost:13370/signalr/hubs';
Run Code Online (Sandbox Code Playgroud)在jQuery中启用CORS:
$.support.cors = true;
Run Code Online (Sandbox Code Playgroud)手动设置响应头Application_BeginRequest:
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();
}
}
Run Code Online (Sandbox Code Playgroud)附加信息:
正如我在“ 堆栈溢出”问题中发现的那样,基本上几乎不需要在上面的“我尝试过的事情”清单中添加的所有内容。解决步骤:
删除上面列出的所有内容。这意味着根本没有在Web.Config或Global.asax等其他地方指定任何自定义标头,也没有自定义jquery设置等。
..除了RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });在Application_Start。
另外,您仍然需要设置 $.connection.hub.url = 'http://localhost:13370/signalr/hubs';
... 而已。 这可能是最好的解决方案,我最终使用了它。
如果您在Chrome中仍然遇到此类问题,则可以使用jsonp获取该协商脚本以正确下载...将以下内容添加到我的JavaScript集线器中即可解决此问题:
//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
});
Run Code Online (Sandbox Code Playgroud)
可能有一种更好的方法来执行此操作,以测试浏览器功能并相应地设置jsonp ...看着用户代理感觉像地狱一样脏...但这暂时解决了我的问题。我希望这可以帮助其他人。
| 归档时间: |
|
| 查看次数: |
11747 次 |
| 最近记录: |