我正在使用最近升级为使用 MVC3 的 Nopcommerce - 以前它使用网络表单。我正在尝试连接到 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 版本中不起作用。没有错误,一切似乎都正常工作。但是,处理继续,执行从服务层(此方法所在的层)返回到控制器,并发出以下重定向:
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 被注入到服务中。使用 HttpContext.Current 可以实现相同的结果
更新:
做更多的挖掘,我发现如果我从任何控制器写入响应流并结束响应,我会得到一个空白(0 长度响应)屏幕。以下是导致上述问题的家庭控制器上的索引操作。在我创建的一次性项目中,相同的代码可以完美运行......
public ActionResult Index()
{
Response.Write("test");
Response.End();
return View(_storeInformationSettings);
}