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

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

参考方案

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

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

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

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

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

如果主机页面看到iframe高度已更改为奇数,则说明Intranet页面已成功加载。

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

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

.NET C#Webbrowser填充输入,不带ID或类名 - javascript

我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…

javascript popupwindow之后的行如何工作? - javascript

好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

退出时发送电子邮件 - javascript

我有一个在ASP.NET 3.5框架上编写的应用程序,它由多个部分组成。比方说,我添加到其中的部分涉及任务生成和更新。目前,我正在尝试添加一项功能,以在我退出任务更新时发送电子邮件更新。我需要考虑几个问题:1)当用户从任务更新导航到应用程序的任何其他部分时,我需要发送电子邮件更新;2)当用户从一个任务导航到另一个任务时(例如,手动更改URL中的任务ID,或从…

在C#中将文本转换为绣花针 - javascript

                                                                                                                    我正在像http://www.vistaprint.in/vp/ns/easypath/studio.aspx?template…

jQuery val函数在隐藏字段上不起作用? - javascript

这是我的HTML代码:<div style='display:none;' id='allformid'> <div> <form action='#'> <input type='text' name='name' …