具有Redirect的Asp.Net 4.0 Ajax Postback生成Double Escaped Url

时间:2013-04-19 19:57:11

标签: ajax redirect updatepanel postback asp.net-4.0

我的会话过期后我开始注意到这个问题,我会点击一个按钮在UpdatePanel内执行Ajax Postback。 ASP会捕获过期的会话并将我重定向到主页,但是它发送给我的URL是转义的,ASP会拒绝请求

网址:%2fDefault.aspx%3fReturnUrl%3d%252fMyPage.aspx%253fCurrentDate%253d2013-04-19%26CurrentDate%3d2013-04-19

错误:The request filtering module is configured to deny a request that contains a double escape sequence.

为了缩小问题,我在UpdatePanel内部和外部设置了Postbacks的测试用例。

Test.aspx文件:

<asp:UpdatePanel runat="server" ID="upTest">
    <ContentTemplate>
        <asp:LinkButton runat="server" ID="lnkAjaxPostbackTest" OnClick="PostbackTest">AJAX Postback Test</asp:LinkButton><br />
        <asp:LinkButton runat="server" ID="lnkAjaxPostbackRedirectTest" OnClick="PostbackRedirectTest">AJAX Redirect Test</asp:LinkButton>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:LinkButton runat="server" ID="lnkPostbackTest" OnClick="PostbackTest">Postback Test</asp:LinkButton><br />
<asp:LinkButton runat="server" ID="lnkPostbackRedirectTest" OnClick="PostbackRedirectTest">Redirect Test</asp:LinkButton>

Test.aspx.cs

protected void PostbackTest(object sender, EventArgs e) {
   var x = 3;
}
protected void PostbackRedirectTest(object sender, EventArgs e) {
    Response.Redirect("~/Default.aspx");
}

结果 常规(非Ajax)回发在所有情况下都能正常工作(即使会话已过期)。但是,当我的会话处于活动状态时,AJAX重定向测试会将我发送到/%2fDefault.aspx,如果会话过期,AJAX回发测试会将我发送到/%2fDefault.aspx%3fReturnUrl%3d%252fTest.aspx

那为什么会这样呢?也许javascript正在处理重定向而它没有执行decodeURIComponent?我在HTTP响应中找不到任何指示应该发生重定向的内容。

1 个答案:

答案 0 :(得分:0)

罪魁祸首是AjaxControlToolkit程序集中的ToolkitScriptManager。我用ASP中提供的常规ScriptManager替换它,问题立刻消失了。

总结:AjaxControlToolkit.ToolkitScriptManager + Ajax Postback + Redirect =&gt;双重逃脱的Uris