hal*_*r73 14 javascript asp.net-mvc cross-domain signalr signalr.client
注意:其他人最初问过这个问题,但在我发布答案之前删除了它.由于这个问题涵盖了开发人员在尝试使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.
Run Code Online (Sandbox Code Playgroud)
我已经按照所有步骤启用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>
Run Code Online (Sandbox Code Playgroud)
我正在为我的SignalR服务器使用PersistentConnection,而不是集线器.
有任何想法吗?
hal*_*r73 17
MapHubs将在/ signalr处配置一个端点,以便与所有Hub类进行通信.由于您没有使用集线器,因此MapHubs无需拨打电话.调用MapHubs也对/ api连接的配置没有任何影响.
您对MapConnection的调用应更改为如下所示:
RouteTable.Routes.MapConnection<ApiConnection>("api", "api",
new ConnectionConfiguration { EnableCrossDomain = true });
Run Code Online (Sandbox Code Playgroud)
注意:第二个参数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');
Run Code Online (Sandbox Code Playgroud)
xdomain不再是SignalR JS客户端的选项,如果你真的想指定jsonp,你应该start在连接时这样做:
connection.start({ jsonp: true}).done(function () { /* ... */ });
Run Code Online (Sandbox Code Playgroud)
我应该重申,如果环境不支持CORS,SignalR将自动回退到JSONP,所以你不应该自己指定这个选项.JSONP不需要Access-Control-Allow-Origin标头,但它确实迫使SignalR使用其最低效的传输:长轮询.
您无需customHeaders在Web.config中进行设置.Access-Control-Allow-Origin当你在你设置EnableCrossDomain为true 时,SignalR会自动设置SignalR响应中的标题ConnectionConfiguration.
参考https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections获取更多建议PersistentConnections.
| 归档时间: |
|
| 查看次数: |
8064 次 |
| 最近记录: |