2009-11-11 63 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()?