我无法从aspx页面重定向到mvc操作。实际上,aspx是支付网关的响应处理程序。然后根据响应代码将用户重定向到适当的操作。但是我在重定向期间遇到了一些问题。之前我曾尝试接受对MVC操作的响应,但是我收到了错误,因此我决定使用aspx来处理响应并重定向到mvc操作。
以下是aspx页面中的代码:
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(Object sender, System.EventArgs e)
{
String result = System.Web.HttpContext.Current.Request["result"];
String paymentID = System.Web.HttpContext.Current.Request["paymentid"];
String respons = System.Web.HttpContext.Current.Request["responsecode"];
String err = System.Web.HttpContext.Current.Request["Error"];
String errmsg = System.Web.HttpContext.Current.Request["ErrorText"];
String tid = System.Web.HttpContext.Current.Request["Trackid"];
String query = String.Format("checkout/PaymentResult?result={0}&paymentid={1}&responsecode={2}&error={3}&errortext={4}&trackid={5}", result, paymentID, respons, err, errmsg, tid);
var _file = new System.IO.StreamWriter(Server.MapPath("~/Response.log"), true);
_file.WriteLine(query);
_file.Close();
//Below line is working fine in aspx pages
System.Web.HttpContext.Current.Response.Write("Redirect=" + ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
//Tried below two, not working
//System.Web.HttpContext.Current.Response.Redirect(ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
//Response.RedirectPermanent(ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
}
</script>
mvc操作响应处理程序的付款网关响应:
如果我通过以下&#34; checkout/PaymentResult
&#34;传递网站网址我得到以下错误。
09:38:40,872 FATAL event.com.aciworldwide.commerce.gateway.payment.MerchantNotificationService [TP-Processor5] - Hack characer/length check failed on redirect URL:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="X-UA-Compatible" content="IE=9">
<title>XXXXXXXss.com - Free home Delivery</title>
另外,我注意到在ASPX中,由于某种原因,页面被调用了两次。首先是来自支付网关的所有值,第二次是空白值。请参阅下面的日志文件详细信息。
checkout/PaymentResult?result=CAPTURED&paymentid=582000001361270&responsecode=00&error=&errortext=&trackid=300009
checkout/PaymentResult?result=&paymentid=&responsecode=&error=&errortext=&trackid=
更新
控制器代码:
public ActionResult PaymentResult(string result, string paymentid, string responsecode, string error, string errortext, string trackid)
{
var cart = _workContext.CurrentCustomer.ShoppingCartItems.Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart)
.LimitPerStore(_storeContext.CurrentStore.Id)
.ToList();
// transaction response code
String _result = (!string.IsNullOrEmpty(result)) ? result : "null";
String _paymentId = (!string.IsNullOrEmpty(paymentid)) ? paymentid : "null";
String _response = (!string.IsNullOrEmpty(responsecode)) ? responsecode : "null";
String _err = (!string.IsNullOrEmpty(error)) ? error : "null";
String _errMessage = (!string.IsNullOrEmpty(errortext)) ? errortext : "null";
String _trackID = (!string.IsNullOrEmpty(trackid)) ? trackid : "null";
// define message string for errors
String _message = getResponseDescription(_response);
Session["PaymentMessage"] = String.Format("Message: {0}, Code: {1}", _message, responsecode);
try
{
var order = _orderService.GetOrderById(Convert.ToInt32(_trackID));
if (_result.Equals("CAPTURED"))
{
try
{
try
{
order.OrderNotes.Add(new OrderNote
{
Note = String.Format("Bank Response= {0}, Code= {1}", _result, _response),
DisplayToCustomer = false,
CreatedOnUtc = DateTime.UtcNow
});
_orderService.UpdateOrder(order);
}
catch (Exception ex)
{
LogException(ex);
}
cart.ToList().ForEach(sci => _shoppingCartService.DeleteShoppingCartItem(sci, false));
order.CaptureTransactionResult = _message;
_orderService.UpdateOrder(order);
_orderProcessingService.MarkOrderAsPaid(order);
}
catch (Exception ex)
{
LogException(ex);
}
return RedirectToRoute("CheckoutCompleted", new { orderId = order.Id });
}
else
{
_orderService.UpdateOrder(order);
order.CaptureTransactionResult = _message;
_orderProcessingService.CancelOrder(order, true);
return Redirect(Url.Action("Cart", "ShoppingCart"));
}
}
catch (Exception ex)
{
LogException(ex);
return Redirect(Url.Action("Cart", "ShoppingCart"));
}
}
我补充说,!IsPostBack
,但它仍然没有做任何事情,空白行仍在进行。
更新2:
我认为问题是在我从网关重定向到应用程序后会话丢失了。我也在使用网络花园,所以我相信工作流程会发生变化。但是,我正在使用ASP.NET进程会话状态。
如何在网络花园中共享会话数据?
答案 0 :(得分:1)
我们进行重定向的方式是从webform应用程序提供完整的URL,而不仅仅是控制器/操作位。因此,请尝试附加域名部分,例如http://www.yoururl.com/checkout/paymentresult ...
N.B我们的网站,mvc和webforms都部署在具有不同端口号的不同iis站点上。两者都共享会话信息。
希望它有所帮助。
更新:刚刚注意到你要附加BaseUrl所以必须有其他东西。 :)
另外,我认为我们必须为页面加载方法添加if(!isPostBack())
。这可以解决双重发布的一个问题