将表单数据发布到查询字符串中没有__VIEWSTATE变量的另一个页面

时间:2014-08-18 11:03:58

标签: c# asp.net

目前我正在使用支付网关与我的ASP.NET应用程序集成,我必须使用GET方法将少量表单变量发布到Payment Gateway页面。当我使用简单的HTML页面使用表单控件来保存值并将其发布到外部支付网关页面时,一切正常。

当我尝试从我的ASP.NET c#应用程序内部执行此操作时,我收到错误“viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey验证算法。无法在集群中使用AutoGenerate。“在检查从我的asp.net c#页面发布到外部支付网关页面的查询字符串时,还有一个额外的__VIEWSTATE变量附加到我想要的查询字符串,该字符串包含我想要发布到支付网关页面的变量值。

我已将EnableViewState =“false”EnableEventValidation =“false”EnableViewStateMac =“false”改为<%Page%>在ASPX页面中的指令,并在代码隐藏的重载onLoad方法中添加了“this.EnableViewState = false”。

供参考添加以下代码段:

ASPX页面

<body>
    <%--<form id="pgform" name="pgform" action="http://xxx.xx.xx.xx:xxxx/_layouts/Portal/EWallet_BillDesk_Dummy.aspx" method="post" runat="server">  --%>
    <form id="pgform" name="pgform" action="http://xxx.xxx.xx.xx:xxxx/PaymentGateway.aspx"
    method="get" target="_blank" runat="server">
    <asp:HiddenField ID="mid" runat="server"></asp:HiddenField>
    <asp:HiddenField ID="mtrxid" runat="server"></asp:HiddenField>
    <asp:HiddenField ID="mitem" runat="server"></asp:HiddenField>
    <asp:HiddenField ID="amount" runat="server"></asp:HiddenField>
    <script type="text/javascript">
        document.pgform.submit();
        //alert("connector fired");
    </script>
    </form>
</body>

代码

    protected override void OnLoad(EventArgs e)
        {
            this.EnableViewState = false;
            base.OnLoad(e);
        }
                protected void Page_Load(object sender, EventArgs e)
        {
                byte[] EncrKeyStream = Encoding.UTF8.GetBytes("nlxcK}~MWgf1WxrT");
                if (Request.QueryString["c"] != null)
                {
                    string qry = ConvertHexToString(Request.QueryString["c"]);
                    string strApplicationNo = qry.Split('|')[0];
                    string strTxnAmount = "1";//qry.Split('|')[1];
                    string mtrxId = "ABCMI" + strApplicationNo;
                    string mItem = "MOTOR INSURANCE";
                    string encmtrxId = EncryptDecrypt.Encrypt(mtrxId, EncrKeyStream);
                    string encmItem = EncryptDecrypt.Encrypt(mItem, EncrKeyStream);
                    string encAmount = EncryptDecrypt.Encrypt(strTxnAmount, EncrKeyStream); ;


                    mid.Value = "ABC_DEV";
                    mtrxid.Value = encmtrxId;
                    mitem.Value = encmItem;
                    amount.Value = encAmount;

                }
}

请在这方面帮助我。我真的需要这个解决方案,现在已经有几个小时了。我找不到一个解决方案。请求你的帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

不要使用<form runat="server" />或服务器端控件。使用标准<form>和普通<input>字段(所有字段均不使用 runat =&#34;服务器&#34; )。这样ASP.NET就不会代表您生成视图状态或其他隐藏字段,您可以提交表单跨主机。

我还提醒您让安全专家审核您的代码以及您使用加密技术。