我的会话过期后我开始注意到这个问题,我会点击一个按钮在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响应中找不到任何指示应该发生重定向的内容。
答案 0 :(得分:0)
罪魁祸首是AjaxControlToolkit程序集中的ToolkitScriptManager。我用ASP中提供的常规ScriptManager替换它,问题立刻消失了。
总结:AjaxControlToolkit.ToolkitScriptManager + Ajax Postback + Redirect =&gt;双重逃脱的Uris