0

我在会话过期后开始注意到这个问题,我会单击一个按钮在 UpdatePanel 内执行 Ajax 回发。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 测试用例。

测试.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>

测试.aspx.cs

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

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

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

4

1 回答 1

0

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

总之:AjaxControlToolkit.ToolkitScriptManager + Ajax 回发 + 重定向 => 双转义 Uris

于 2013-04-19T20:31:29.423 回答