gpt4 book ai didi

javascript - 跨域不适用于 SignalR PersistentConnection

转载 作者:可可西里 更新时间:2023-11-01 01:51:10 26 4
gpt4 key购买 nike

注意:最初有人问过这个问题,但在我发布答案之前将其删除。由于这个问题涵盖了开发人员在尝试使 SignalR 跨域工作时面临的许多问题,因此我决定复制它。另外,我已经写完答案了!

我在 ASP.NET MVC .NET Framework 4 项目中运行 SignalR 1.0.1 服务器。我在不同的域(不同的本地主机端口)上有另一个 ASP.NET 应用程序试图通过 JavaScript 客户端连接。当我的应用程序尝试连接时,我得到了这个:

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。第一个参数是路由名称。 / 是不必要的,但在任何一种情况下都不会造成真正的伤害。

  • Setting jQuery.support.cors = true; should ONLY be done “在尚不支持 cors 但支持 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,您应该在你像这样开始连接:

     connection.start({ jsonp: true}).done(function () { /* ... */ });

    我要重申,如果环境不支持 CORS,SignalR 将自动回退到 JSONP,因此您不应自己指定此选项。 JSONP 不需要 Access-Control-Allow-Origin header ,但它会强制 SignalR 使用其效率最低的传输方式:长轮询。

  • 您不需要在 Web.config 中设置 customHeaders。当您在 ConnectionConfiguration 中将 EnableCrossDomain 设置为 true 时,SignalR 将在 SignalR 响应中自动设置 Access-Control-Allow-Origin header 。

引用 https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections有关使用 PersistentConnections 的更多建议。

关于javascript - 跨域不适用于 SignalR PersistentConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com