2013-02-27 48 views
0

我正在研究一个应用程序,以使用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 || {})); 

回答

2

的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)来验证浏览器是否实际进行“协商”请求。如果是这样,你可以看看回应,以帮助弄清楚发生了什么。