我即将准备好解决这个问题,因为所有指南都显示相同的一两个解决方案,这似乎对除我自己以外的所有人都有效。
我在 Mono 应用程序中使用 SignalR,使用 Owin。我在 HubConfiguration 中设置了 EnableCrossDomain = true。我已经设置了一个使用 javascript 进行连接的简单测试页面。和url 加载没有问题negotiate
,ping
似乎回复正确。connect
但是,我在通话中遇到跨域错误。
它肯定在使用我的 EnableCrossDomain 设置,因为如果我将其设置为 false,negotiate
则不起作用。
这是我要连接的 Javascript(是的,我包括 /signalr/hubs 脚本,它返回适当的 javascript):
$.connection.hub.url = 'http://localhost:7001/signalr';
$.connection.hub.logging = true;
$.connection.hub.start()
.done(function () { alert("Now connected!"); })
.fail(function () { alert("Could not Connect!"); });
我也试过jQuery.support.cors = true;
了,但没有任何区别。
我也尝试像这样连接到常规的 PersistantConnection,但遇到了同样的问题,所以它似乎与集线器没有直接关系:
var connection = $.connection('/raw');
connection.url = 'http://localhost:7001/signalr';
connection.start()
.done(function () { alert("Now connected!"); })
.fail(function () { alert("Could not Connect!"); });
我在这里做错了什么?为什么做ping
和negotiate
工作却不做connect
?
编辑:为了让事情变得更奇怪,我添加了一些日志记录并验证 SignalRCallHandler
类正在Access-Control-Allow-Origin
为所有请求添加标头,包括connect
请求。所以它应该工作。
编辑 2:所以实际上由于 curl 它看起来服务器正在返回一个 500 响应代码,并且由于它不包括标题(这必须在我添加日志记录的代码块之后发生),Chrome 抱怨跨站点,当真的有可能在服务器的某个地方抛出异常时。希望我能尽快解决这个问题,并在此处发布答案。