发出从ASPX页面重定向到MVC操作的问题

时间:2016-05-08 10:50:58

标签: c# asp.net asp.net-mvc session iis

我无法从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进程会话状态。

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

1 个答案:

答案 0 :(得分:1)

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

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

希望它有所帮助。

更新:刚刚注意到你要附加BaseUrl所以必须有其他东西。 :)

另外,我认为我们必须为页面加载方法添加if(!isPostBack())。这可以解决双重发布的一个问题