我在会话过期后开始注意到这个问题,我会单击一个按钮在 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 响应中找不到任何表明应该发生重定向的内容。