1

私は現在、いくつかの場所で iFrame を使用してイントラネットからページをロードする Web サイトを持っています (これは避けられません)。私がやりたいことは、クライアントが現在の場所からイントラネット ページにアクセスできるかどうかを検出できるようにすることです。私は次のコードを持っていますが、明らかに、サーバーがイントラネットに接続できるかどうかのみをチェックします (ネタバレ注意: 完全に接続できます)。

public bool IsAvailable()
    {
        HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create("http://localintranetsite/");
        httpReq.AllowAutoRedirect = false;

        try
        {
            HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse();
            if (httpRes.StatusCode == HttpStatusCode.NotFound)
                return false;
            else
                return true;
        }
        catch
        {
            return false;
        }
    }

もちろん、可能であれば、WebサイトユーザーのIPアドレスの検出に依存することなく、これを実行できるようにしたいと考えています.

私の他のオプションは、イントラネット サイトに接続できない場合にカスタム 404 ページを作成することです。

iFrame をロードするコードが javascript から呼び出される Web サービスにあることに違いがある場合は、私の Web サービスに含まれる asp.net ソリューションが理想的ですが、javascript 関数も機能します。

私の(役に立たない)現在のソリューションは、イントラネット サイトにアクセスできるかどうかを確認しようとしますが、クライアントではなく Web サーバーがアクセスできるかどうかのみを確認できます。

好奇心旺盛な人のために、これは(jQueryを介した)javascriptの方法です(クロスドメインであるため機能しません):

    $.ajax({
        type: 'HEAD',
        url: 'http://intranetsite/',
        success: function () {
            local = true;
        },
        error: function () {
            local = false;
        }
    })
4

1 に答える 1

1

イントラネットのURLはメインページとは異なるホストドメインにあるため、ページで実行されているJavaScriptは、iframe内で何が起こっているかを直接判断できません。iframeがイントラネットサイトに接続できない場合、ホストドメインの違いにより、エラー状態は外部ページに表示されません。

ただし、クロスドメインの状況でも、iframeがデータをホストページに公開できる方法があります。たとえば、iframeの幅または高さの変更は、iframeの内側または外側から行うことができ、両側から見ることができます。

1つの解決策は、イントラネットサイトからiframeにロードするhtmlページにJavaScriptコードを追加して、iframeの幅または高さを特別な値に設定することです。iframeがホストページに表示されていない場合は、幅と高さを任意の整数値に設定できます。iframeを表示する必要がある場合は、幅または高さを偶数または奇数の値に設定することで、境界を越えてブール情報を渡すことができます。

したがって、たとえば、イントラネットWebページで、ページの読み込み時に奇数の値にインクリメントして高さを変更するようにします。

ホストページのJavaScriptでiframeの初期の高さを偶数に設定してから、イントラネットのURLをiframe.srcプロパティに割り当てます。しばらくしてから、ホストページのJavaScriptでiframeの高さを確認してください。iframeの高さが以前と同じである場合は、URLが読み込まれていません。時間が経過している場合は、クライアントからイントラネットサイトにアクセスできないためか、URLが読み込まれていません。

ホストページがiframeの高さが奇数に変更されたことを確認した場合は、イントラネットページが正常に読み込まれたことがわかります。

このアプローチは、失敗の明確なシグナルを提供しませんが、成功の明確なシグナルを提供する必要があります。

サポートする必要のあるブラウザーが十分に最新のものである場合は、HTML5 window.postMessageを使用して、同じブラウザー内のドメイン境界を越えてDOM要素間で通信することを検討してください。https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

于 2012-10-31T00:11:28.747 に答える