0

私は、SignalRを使用して複数のWebホストアプリケーション間でコンテキスト同期を実行するアプリケーションに取り組んでいます。クライアントマシンは、SignalR Owinホストを使用してホストをインスタンス化し、アプリケーションは、プロキシなしのバージョンのJSクライアントを使用してホストに接続します。私が抱えている問題は、「クライアント」アプリケーションがSSL環境でホストされていることです(ローカルマシンに制約されているため)。javascriptクライアントをホストしている標準の非SSLWebサイトからハブに接続しようとすると、すべてが機能します。ただし、クライアントをSSL Webサイトにロードするとすぐに、接続を開始しようとすると「SignalR:ネゴシエーション要求中のエラー:未定義」が表示されます。誰かがこれを回避する方法を知っていますか?

亭主:

    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 || {}));
4

1 に答える 1

2

SignalR JS クライアントは、特に SignalR サーバーとの双方向通信を確立するために、どのトランスポート (WebSocket など) を使用する必要があるかを "ネゴシエート" するために XHR を作成します。

ブラウザー ベンダーは、HTTPS ページから HTTP リソースへの XHR の作成を許可しないことを選択できます: http://www.w3.org/TR/access-control/#user-agent-security

4 番目の箇条書きに注意してください。「ユーザー エージェントはアルゴリズムを終了でき、リクエストを作成できません。たとえば、... . https から http へのアクセスは許可されていません。」

安全でない XHR を使用すると、他の方法では安全な Web アプリケーションが中間者攻撃に対して脆弱になる可能性があるため、ブラウザー ベンダーはこれを選択する可能性があります。

ブラウザの F12 ツールを使用するか、 fidlerのような HTTP プロキシを使用して、ブラウザが実際に「ネゴシエート」リクエストを行っていることを確認します。そうである場合は、応答を見て、何が起こっているのかを理解するのに役立てることができます。

于 2013-02-27T20:33:20.470 に答える