加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Chrome 27中SignalR和跨域请求的问题

发布时间:2020-12-15 20:52:52 所属栏目:asp.Net 来源:网络整理
导读:编辑:这显然只是Chrome中的一个问题,它在FF和IE中运行良好 Chrome版本:27.0.1453.116 我在localhost:13371上有一个简单的JS / HTML站点,我正在尝试访问localhost:13371上的SignalR中心. 无论何时发出请求,我都会收到以下错误: XMLHttpRequest cannot lo
编辑:这显然只是Chrome中的一个问题,它在FF和IE中运行良好

Chrome版本:27.0.1453.116

我在localhost:13371上有一个简单的JS / HTML站点,我正在尝试访问localhost:13371上的SignalR中心.

无论何时发出请求,我都会收到以下错误:

XMLHttpRequest cannot load http://localhost:13370/signalr/hubs/negotiate?_=1372338722032. Origin http://localhost:13371 is not allowed by Access-Control-Allow-Origin.

我已经尝试过了:

>在Application_Start上启用SignalR上的跨域:

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

>在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>

>在JavaScript中设置信号器中心的连接URL:

$.connection.hub.url = 'http://localhost:13370/signalr/hubs';

>在jQuery中启用CORS:

$.support.cors = true;

>在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();
    }
}

以上都没有,也没有上述任何组合起作用.

附加信息:

>这两个站点都在Windows 7上的IIS中运行
> SignalR站点在端口13370上运行,作为.NET 4.0下MVC 4站点的一部分.
> JS / HTML站点是端口13371上的简单Web服务器,根本没有托管代码.
> SignalR站点肯定会响应浏览器对相关资源的直接请求.
> SignalR版本是1.1.2

解决方法

编辑:我现在找到了两个解决方案……

方法1.摆脱你可能不需要的垃圾:

正如我在Stack Overflow question中发现的那样,基本上我在上面列出的“我尝试过的东西”中添加的几乎所有内容都是不必要的.修复步骤:

>删除我在上面尝试过的所有内容.这意味着在Web.Config或其他地方(如Global.asax)没有指定自定义标头,没有自定义jquery设置等.
> ..除了RouteTable.Routes.MapHubs(new HubConfiguration {EnableCrossDomain = true});在Application_Start中.
>你还需要设置$.connection.hub.url =’http:// localhost:13370 / signalsr / hubs’;

… 而已.这可能是最好的解决方案,也是我最终使用的解决方案.

方法2.如果您在Chrome中仍然遇到问题,请使用jsonp:

如果你在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
});

可能有一种更好的方法来测试浏览器功能并相应地设置jsonp ……看着用户代理感觉很脏……但是这解决了我在过渡时期的问题.我希望这有助于其他人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读