2009-11-11 66 views
4

在控制器操作中,我使用WebRequest手動將表單發送到遠程URL。我成功地收到了一個包含要顯示的html頁面的WebResponse。我想將該響應「粘貼」爲操作的響應(類型爲HttpResponseBase)。一個動作通常會返回一個ActionResult,那麼如何結束我的控制器操作,以便WebResponse成爲結果?WebResponse到HttpResponseBase。可能嗎?

注意:瀏覽器中的Url也必須成爲響應的URL。

更新:這是目標。這是在PayPal結帳頁面上。我想要一個簡單的結帳按鈕鏈接到我的某個操作,而不是在所有購物車隱藏字段和結算提交按鈕的窗體中顯示。在這個動作中,我將使用表單準備WebRequest並將其發送到PayPal。在一個動作中這樣做也允許我將未激活的訂單存儲在數據庫表中,這樣當訂單確認到達時,我可以將其與存儲的訂單進行比較並將其激活。

解決方案:感謝那些誰回答指出,這將不可能重定向與POST。看來,我沒有義務通過POST重定向到PayPal。相反,我可以在查詢字符串中構建一個包含所有購物車數據的URL並重定向到它。從控制器操作方法執行它仍然允許我將掛起的訂單存儲在數據庫中。

感謝

回答

4

如果你只是想的WebRequest響應的內容發送回從您的控制器動作的響應,你可以做這樣的事情在你的操作方法:

WebRequest req = WebRequest.Create("http://www.google.com"); 
WebResponse res = req.GetResponse(); 
StreamReader sr = new StreamReader(res.GetResponseStream()); 

ContentResult cr = new ContentResult(); 
cr.Content = sr.ReadToEnd(); 

return cr; 

這更簡潔:

WebRequest req = WebRequest.Create("http://www.google.com"); 
WebResponse res = req.GetResponse(); 

FileStreamResult fsr = new FileStreamResult(res.GetResponseStream(),res.ContentType); 

return fsr; 
+0

謝謝。問題是內容不夠(請參閱上面的更新)。結果還包含標題和可能的cookie。如果我只是設置內容,所有這些數據將不會被使用。最終結果是瀏覽器中的Url不正確(它應該是https:// ... paypal .../....)。現在我正在使用PayPal沙盒進行測試。即使我在同一瀏覽器中登錄沙箱,貝寶的迴應是我沒有登錄到沙箱。 – 2009-11-11 15:46:13

+0

我不熟悉貝寶,但爲什麼你使用WebRequest來做到這一點?我會假設他們有一個API或其他東西。你應該看看。至於我的解決方案,您可以輕鬆將WebResponse中的Cookie和其他標題複製到您的操作的響應中。 – Matthew 2009-11-11 15:57:32

0

這是沒有直接的方式來做到這一點。我對ASp.NET不太瞭解。您是說您的ASP.net頁面正在向遠程站點發送HTTP請求,並獲取響應,並且您希望該響應成爲HTTPResponseBase?那之後你想用它做什麼?

請參見下面的一個類似的主題,以便線程... How do I mock HttpResponseBase.End()?