1

我目前有一个网站,在某些地方使用 iFrame 从我们的 Intranet 加载页面(这是不可避免的)。我想要做的是能够检测客户端是否能够从其当前位置访问 Intranet 页面。我有以下代码,但显然它只检查服务器是否可以联系 Intranet(剧透警报:它完全可以)。

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;
        }
    }

当然,如果可能的话,我希望能够做到这一点而不必依赖检测网站用户的 IP 地址。

我的另一个选择是在无法联系 Intranet 站点时执行自定义 404 页面,但我不确定我是否可以这样做(或者我是否可以这样做)。

如果它有任何区别,加载 iFrame 的代码位于从 javascript 调用的 Web 服务中,因此虽然我的 Web 服务中的 asp.net 解决方案是理想的,但 javascript 函数也可以工作。

我的(没有帮助的)当前解决方案尝试检查是否可以访问 Intranet 站点,但它只能检查 Web 服务器是否可以访问它,而不是客户端。

对于那些好奇的人,这是 javascript(通过 jQuery)方式(它不起作用,因为它是跨域的):

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

1 回答 1

1

由于您的 Intranet url 与主页位于不同的主机域中,因此页面上运行的 JavaScript 无法直接确定 iframe 内部发生的情况。如果 iframe 无法联系到内网站点,由于主机域的不同,错误状态对外部页面将不可见。

但是,即使在跨域情况下,iframe 也可以通过多种方式向主机页面公开数据。例如,可以从 iframe 内部或外部对 iframe 的宽度或高度进行更改,并且可以从两侧看到。

一种解决方案可能是将一些 JavaScript 代码添加到您从 Intranet 站点加载到 iframe 的 html 页面中,以将 iframe 的宽度或高度设置为特殊值。如果 iframe 在主机页面上不可见,则可以将宽度和高度设置为所需的任何整数值。如果 iframe 确实需要可见,您可以通过将宽度或高度设置为偶数或奇数值来跨边界传递布尔信息。

因此,例如,让 Intranet 网页通过在页面加载时将其增加为奇数值来修改其高度。

让主机页面中的 JavaScript 将 iframe 的初始高度设置为偶数,然后将 Intranet URL 分配给 iframe.src 属性。经过一段时间后,让主机页面 JavaScript 检查 iframe 高度。如果 iframe 高度仍然是之前的高度,则 URL 尚未加载。如果过了很长时间,那么 URL 没有加载可能是因为客户端无法访问 Intranet 站点。

如果宿主页面看到iframe高度变成了奇数,那么你就知道内网页面加载成功了。

这种方法不会为失败提供明确的信号,但应该为成功提供明确的信号。

如果您需要支持的浏览器足够现代,您可能会考虑使用 HTML5 window.postMessage 在同一浏览器内跨域边界的 DOM 元素之间进行通信。https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

于 2012-10-31T00:11:28.747 回答