gpt4 book ai didi

asp.net-mvc-3 - ASP.NET MVC 3 - 替换 HttpContext 响应不起作用

转载 作者:行者123 更新时间:2023-12-02 04:53:14 24 4
gpt4 key购买 nike

我正在使用 Nopcommerce,它最近已升级为使用 MVC3 - 之前它使用 Webforms。我正在尝试连接到 Worldpay(支付网关)托管网站。该过程有点复杂,但本质上需要向 Worldpay 提交一份表格,然后用户被重定向到其托管网站以填写信用卡详细信息等。

Nopcommerce 使用 Post 方法来处理此问题,该方法在服务器端构建需要发布的表单,并用构建的 HTML 替换 httpcontext 响应

_httpContext.Response.Clear();
_httpContext.Response.Write("<html><head>");
_httpContext.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
_httpContext.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));
for (int i = 0; i < _inputValues.Keys.Count; i++)
_httpContext.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", HttpUtility.HtmlEncode(_inputValues.Keys[i]), HttpUtility.HtmlEncode(_inputValues[_inputValues.Keys[i]])));
_httpContext.Response.Write("</form>");
_httpContext.Response.Write("</body></html>");
_httpContext.Response.End();

这在 Webforms 版本中工作正常,但在 MVC 版本中不起作用。没有错误,一切看起来都工作正常。但是,处理会继续,执行会从服务层(此方法所在的层)返回到 Controller ,并发出以下重定向:

 return RedirectToRoute("CheckoutCompleted");

在修改服务器端响应方面,MVC 的工作方式与 Web 表单不同吗?我已经尝试了以下代码,并且可以确认 worldpay 确实受到了攻击,并且正在发送我期望的响应:

_httpContext.Response.Clear();
var webClient = new WebClient();
var responseBytes = webClient.UploadValues(Url, "POST", _inputValues);
var response = Encoding.UTF8.GetString(responseBytes);
_httpContext.Response.Write(response);
_httpContext.Response.End();

注意:在上面的示例中,HttpContext 被注入(inject)到服务中。使用 HttpContext.Current 可以获得相同的结果

更新:

再做一点挖掘,我发现如果我从任何 Controller 写入响应流并结束响应,我会得到一个空白(0长度响应)屏幕。以下是导致上述问题的家庭 Controller 上的索引操作。相同的代码,在我创建的一次性项目中,可以完美地工作......

  public ActionResult Index()
{
Response.Write("test");
Response.End();
return View(_storeInformationSettings);
}

最佳答案

如果您更改代码的第三个片段,您可以将 Response.Write 和 Response.End 保留在 Controller 之外。

HttpContext.Current.Response.Clear();
var webClient = new WebClient();
var responseBytes = webClient.UploadValues(Url, "POST", _inputValues);
var response = Encoding.UTF8.GetString(responseBytes);
HttpContext.Current.Response.Write(response);
HttpContext.Current.ApplicationInstance.CompleteRequest();

HttpContext.Current.ApplicationInstance.CompleteRequest(); 为我解决了这个问题。另请参阅关于此的好帖子 MSDN Blog about Response.End and Response.Close

关于asp.net-mvc-3 - ASP.NET MVC 3 - 替换 HttpContext 响应不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com