繁体   English   中英

跨域不适用于SignalR PersistentConnection

[英]Cross-domain will not work with a SignalR PersistentConnection

注意 :其他人最初问过这个问题,但在我发布答案之前删除了它。 由于这个问题涵盖了开发人员在尝试使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,而不是集线器。

有任何想法吗?

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,则除非jQuery.support.cors设置为true, 否则 SignalR将自动回退到JSONP。

    如果您只是盲目地将其设置为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 SignalR将设置Access-Control-Allow-Origin ,当你设置自动SignalR响应头EnableCrossDomain在你真正ConnectionConfiguration

参考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections以获得有关使用PersistentConnections更多建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM