SignalR:将SSL页面上的JS客户端连接到不使用SSL的SelfHost
问题描述:
我正在研究一个应用程序,以使用SignalR在多个Web托管应用程序之间执行上下文同步。客户端机器使用SignalR Owin主机实例化主机,并且应用程序通过JS代理的无代理版本连接到主机。我遇到的问题是“客户端”应用程序托管在SignalR主机所不具备的SSL环境中(因为它受限于本地计算机)。如果我尝试从托管JavaScript客户端的标准非SSL网站连接到Hub,则一切正常。只要我将客户端加载到SSL网站,但是当我尝试启动连接时,我收到了“SignalR:协商请求期间的错误:未定义”。任何人都知道解决这个问题?SignalR:将SSL页面上的JS客户端连接到不使用SSL的SelfHost
主机:
public class SignalRHost : IDisposable
{
private IDisposable _webApp;
public SignalRHost(string url = "http://localhost:9000/")
{
_webApp = WebApplication.Start<Startup>(url);
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
bool enableErrorDetail = false;
#if DEBUG
enableErrorDetail = true;
#endif
app.MapHubs(new HubConfiguration { EnableCrossDomain = true, EnableDetailedErrors = enableErrorDetail });
}
}
public void Dispose()
{
_webApp.Dispose();
}
}
JS客户:
(function (ns_HubClient) {
ns_HubClient.connection;
ns_HubClient.proxy;
ns_HubClient.initialize = function() {
ns_HubClient.connection = $.hubConnection("http://localhost:9000");
ns_HubClient.proxy = ns_HubClient.connection.createHubProxy("fluencyHub");
ns_HubClient.proxy.on('addMessage', function (data) { ns_HubClient.processMessage(data); });
ns_HubClient.connection.start()
.done(function() {
alert("connection complete");
})
.fail(function (data) {
alert("connection start failed: " + data);
});
};
ns_HubClient.login = function (sUserName, sPassword, sDomain) {
var fluencyMessage = {
MessageId: "",
CallType: "Asynchronous",
Method: "Login",
Status: "",
Response: {},
Request: {
sUserName: sUserName,
sPassword: sPassword,
sDomain: sDomain
}
};
ns_HubClient.sendMessage(fluencyMessage);
};
ns_HubClient.writeLog = function (message, errorLevel) {
var logMessage = {
ErrorLevel: errorLevel,
Message: message
};
ns_HubClient.proxy.invoke("logMessage", logMessage);
};
ns_HubClient.processMessage = function (message) {
};
ns_HubClient.sendMessage = function (data) {
ns_HubClient.proxy.invoke("addMessage", data);
};
} (window.ns_HubClient = window.ns_HubClient || {}));
答
的SignalR JS客户端发出一个XHR “谈判” 其输送(例如WebSockets的)应该被用来建立与SignalR双向通信服务器等等。
浏览器厂商可以选择不允许从HTTPS建立了XHR时页面,HTTP资源:http://www.w3.org/TR/access-control/#user-agent-security
注意的第四个项目符号点:“用户代理被允许终止算法并没有提出请求这可能是完成,因为例如:...。https到http是不允许的。“
浏览器供应商可能会选择这样做,因为非安全XHR可以使其他安全的Web应用程序容易受到中间人攻击。
我会使用您的浏览器的F12工具或使用HTTP代理(如fidler)来验证浏览器是否实际进行“协商”请求。如果是这样,你可以看看回应,以帮助弄清楚发生了什么。