c# - 如何检测客户端是否可以访问 iFrame 中的网站?

标签 c# javascript jquery asp.net ajax

我目前有一个网站,在某些地方使用 iFrame 从我们的 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;
        }
    })

最佳答案

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

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

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

例如,让 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

关于c# - 如何检测客户端是否可以访问 iFrame 中的网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148940/

相关文章:

c# - 当 visible=false 时,asp.net requiredfieldvalidator 不工作

c# - 链接 .NET 委托(delegate)时,如何(重新)使用原始实例?

javascript - 将字符串转换为 JSON 对象

javascript - Socket.io 类型错误 : undefined is not a function

javascript - 如何将 'lock' 滚动到 div?

javascript - jQuery 和 Javascript : offset. top() 没有响应

javascript - 在单元格过滤器突出显示上保留链接标记

c# - 是否可以保证 AsyncCallbacks 始终在主线程上执行?

c# - 似乎无法通过 ASP.Net Core 连接到 SQL Server(一直返回空值)

javascript - Django Javascript 和调试