我想我已经解决了。当然,依靠内部的 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";
}
}