跨域将无法与SignalR PersistentConnection工作(Cross-domain

2019-07-21 10:18发布

:最初是他人问过这个问题,但删除了它之前,我可以张贴我的答案。 由于这个问题涉及开发商试图让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服务器,而不是集线器。

有任何想法吗?

Answer 1:

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



文章来源: Cross-domain will not work with a SignalR PersistentConnection