2012-06-20 67 views
5

我有一個用戶提交訂單的頁面,在他們提交後,我想要一個url(http://externalsite.com?id=12345&sessionid=abc123)而不實際將其重定向到外部頁面。如何模擬對網址的訪問?

有沒有辦法做到這一點?

+2

你需要*用戶的瀏覽器*來獲取它,或者你可以從你的服務器上做到這一點嗎? –

回答

8

當然,從服務器端代碼中使用HttpWebRequest。這裏有一個例子:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
    "http://externalsite.com?id=12345&sessionid=abc123"); 
request.Method = "GET"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    string result = reader.ReadToEnd(); 
    // Process the response text if you need to... 
} 
2

您可以使用WebClient類問題在您的服務器端代碼Asp.Net的HTTP請求。然後,你可以做任何你喜歡的結果html。

5

如果您需要http://externalsite.com/用戶的cookie(登錄信息和其他用戶設定),您可以嵌入一個<iframe>僞造的圖像使用從用戶的瀏覽器的AJAX請求。

使用的<iframe>

使用 「僞造」 的形象要求(如果你可以忽略任何可能的圖像類型的問題):

<img src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" /> 

最簡單的形式使用jQuery's cross-browser ajax support

$.ajax({ 
    url: "http://externalsite.com?id=12345&sessionid=abc123" 
}); 

您還可以將其他格式應用於hi去iframe或圖像,或者當它達到擊中其他服務器的目的時,使用javascript刪除它。

0

結合上面的兩個答案,來自voithos和Joel Purra,我建議你考慮第三種方案。以下是我對每個人的評估:

1)更有把握的方法是將服務器端作爲您的操作處理程序的一部分,以便實際提交用戶信息。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
    "http://externalsite.com?id=12345&sessionid=abc123"); 
request.Method = "GET"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    string result = reader.ReadToEnd(); 
    // Process the response text if you need to... 
} 

這使你的服務器擊中了他們的服務器,並確保它被稱爲:可以通過voithos'以上方法可以輕鬆完成。這種方法的缺點是它使你的服務器有次要HTTP請求的開銷。如果其他服務器速度很慢,這可能會造成阻塞問題,從而導致您的結果明顯緩慢。你可以通過多線程/異步來解決這個問題 - 但是你得到了這個圖像:它引入了一堆問題來解決這個問題,而這些問題在你的控制之外 - 但是 - 它確保你知道遠程源是否被命中,並且答覆是什麼。 2)或者,如果你的用戶正在製作一個實際的帖子,並獲得一個新的頁面的HTML響應,你可以簡單地將Joel Purra的響應注入到該頁面的HTML中,迫使用戶的瀏覽器負責遠程服務器。

<div style="display: none;"> 
<iframe src="http://externalsite.com?id=12345&sessionid=abc123"></iframe> 
</div> 

這種方法的缺點是,如果出於某種原因關閉請求你的客戶火災和不等待加載下一頁面,外部站點返回404錯誤等,不僅將外部處理沒有完成 - 你不會知道它沒有完成。3)如果您有能力使用客戶端庫(如jQuery)進行處理,那麼我建議您將所有表單提交內容以異步方式進行發佈。該方法是這樣的:

<script type="text/javascript"> 
    $(document).bind('ready', function() { 
     $('#formSubmitButton').bind('click', function (ev) { 
      ev.preventDefault(); // These two lines stop the default processing from 
      ev.stopPropagation(); // occurring on form-submit (i.e. no full post-back) 

      // This line starts an asynchronous call to the server, posting your form 
      // data itself. 
      $.ajax({ 
       url: '/My/Post/Url', 
       type: 'POST', 
       async: false, 

       // You could use a library for this kind of form parsing. I suggest 
       // http://www.json.org/js.html - for serialization, and 
       // http://code.google.com/p/form2js/ - for form conversion. It's great. 
       data: { my: 'form', data: 'fields' }, 

       success: function (data) { 
        $.ajax({ 
         url: '/The/External/Url', 
         type: 'POST', 
         async: false, 

         data: { external: 'data', goes: 'here' }, 
         success: function (remoteData) { 
          if (remoteData) // validate response here 
           displaySuccess(); 
          else 
           displayFailure(); 
         }, 
         error: displayFailure 
        }); 
       }, 
       error: displayFailure 
      }); 
     }); 
    }); 
</script> 

在此方法 - 你做張貼到您自己的服務器,併成功 - 立即火了第二個請求到遠程服務器。但是,因爲您等待直到第二個請求已被觸發時才顯示成功/失敗 - 您知道至少在UI層,兩個請求都是在客戶端獲得隊列離開頁面之前完成的。

因此 - 從工作流程和開銷角度來看可能更安全 - 但是,它需要您在JavaScript中編寫一些UI級別的邏輯,這可能會有問題,具體取決於您的項目。