我正在使用jQuert .ajax函数来调用页面方法.该网站正在使用FormsAuthentication.因此,当身份验证票证到期时,对页面方法的调用显然会导致重定向到登录页面.
现在,编写System.Web.Handlers.ScriptModule的天才决定,如果出于某种原因对页面方法或Web服务方法的REST样式调用,从JavaScript导致302重定向,他们只是简单地转向回复401未经授权.这会导致浏览器弹出一个完全误导的登录UI,因为用户试图键入他们的用户名和密码,这意味着什么,因为使用了FormsAuthentication.最后,当用户单击“取消”时,401将进入错误处理程序.
解决方法
我想我是在解决它.当然依赖于内部MS AJAX相关的错误并不是很好,但是这对于遇到这个问题的其他人来说也是有用的.
基本上你做的是,你将X-MicrosoftAjax标头设置为值Delta = true(这里的情况很重要),ScriptModule会将此解释为正常重定向,并将响应转换为200,但会设置pageRedirect数据要使用的页面上任何ScriptManager(MS-AJAX PageRequestManager)的字符串. jQuery.ajax函数仍会将此视为错误,因此基本上您可以在XHR的responseText属性中检查pageRedirect并相应地对其进行处理.就像将用户发送到某个东西的登录页面一样.
$.ajax({ type: "POST",url: postUrl + "/SomePageMethod",data: "{searchString:\"" + escape(searchString) + "\"}",contentType: "application/json; charset=utf-8",beforeSend: function(xhr) { xhr.setRequestHeader("X-MicrosoftAjax","Delta=true"); },dataType: "json",success: onSuccess,error: onError }); function onError(xhr,e,textStatus) { var isAjaxRedirect = xhr.status == 200 && xhr.responseText.match(/pageRedirect/); if (isAjaxRedirect == "pageRedirect") { // forms authentication ticket expired location.href = "a session timeout page,or a login page or whatever"; } }