2012-10-30 59 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

相關問題