2012-10-30 58 views
1

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

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

回答

1

因为你的企业内部网的网址是比主不同的主机域名页面上运行的JavaScript无法直接确定iframe中发生了什么。如果iframe无法联系Intranet站点,则由于主机域的差异,外部页面不会看到错误状态。

但是,即使在跨域情况下,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窗口。postMessage在同一个浏览器内跨越域边界的DOM元素之间进行通信。 https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

+1

+1。请注意,postMessage在IE8及更高版本中可用,因此除非必须支持IE6/7,否则它是在不同域上的帧之间进行通信的最佳方法。 –

+0

感谢您的反馈 - 不幸的是,我可能必须这样做,而无需访问其他Intranet网站。根据我的理解,我们托管它,其他人运行它。 – Maverick

相关问题