- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
注意:最初有人问过这个问题,但在我发布答案之前将其删除。由于这个问题涵盖了开发人员在尝试使 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/
注意:最初有人问过这个问题,但在我发布答案之前将其删除。由于这个问题涵盖了开发人员在尝试使 SignalR 跨域工作时面临的许多问题,因此我决定复制它。另外,我已经写完答案了! 我在 ASP.NET
我使用的是 SignalR/PersistentConnection,而不是集线器。 我想从服务器向客户端发送消息。我有客户端 ID 来发送它,但是如何从服务器向客户端发送消息? 就像,当服务器上发生
我在我的 Android 项目中使用 Firebase(版本 10.0.0)并遇到以下 Firebase 数据库问题: 先决条件:用户使用 Google 帐户通过 Firebase Auth 登录(F
我使用派生自 PersistentConnection 的类 Echo,我想向特定连接发送消息: var client = GlobalHost.ConnectionManager.GetConnec
我是一名优秀的程序员,十分优秀!