从ASPX页面重定向到MVC操作时出现问题



我在从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操作响应处理程序的支付网关响应:
如果我通过网站的URL和下面的"checkout/PaymentResult"我得到下面的错误。

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进程外会话状态。

如何在网络花园中共享会话数据?

我们重定向的方式是从webform应用程序提供完整的url,而不仅仅是控制器/操作位。所以请尝试附加域部分,例如http://www.yoururl.com/checkout/paymentresult...

N.B我们的网站mvc和webforms都部署在不同端口号的独立iis网站上。两者共享会话信息。

希望能有所帮助。

更新:刚刚注意到你正在附加BaseUrl,所以肯定还有其他内容。:)

此外,我认为我们必须将if(!isPostBack())用于页面加载方法。这可以解决双重过账的一个问题

最新更新