我知道这是一个晚回答,实际上我有一个快捷的方法来发布/读取基于MS的服务。它适用于MVC以及ASMX等...
使用:
$.msajax(
'/services/someservice.asmx/SomeMethod'
,{}
,function(data,jqXHR) {
}
,function(err,jqXHR) {
}
);
(function ($) {
var tries = 0;
$.msajax = function (url, data, onSuccess, onError) {
return $.ajax({
'type': "POST"
, 'url': url
, 'contentType': "application/json"
, 'dataType': "json"
, 'data': typeof data == "string" ? data : JSON.stringify(data || {})
,beforeSend: function(jqXHR) {
jqXHR.setRequestHeader("X-MicrosoftAjax","Delta=true");
}
, 'complete': function(jqXHR, textStatus) {
handleResponse(jqXHR, textStatus, onSuccess, onError, function(){
setTimeout(function(){
$.msajax(url, data, onSuccess, onError);
}, 100 * tries);
});
}
});
}
$.msajax.defaultErrorMessage = "Error retreiving data.";
function logError(err, errorHandler, jqXHR) {
tries = 0;
if (typeof err == "string") err = { 'Message': err };
if (console && console.debug && console.dir) {
console.debug("ERROR processing jQuery.msajax request.");
console.dir({ 'details': { 'error': err, 'jqXHR':jqXHR } });
}
try {
errorHandler(err, jqXHR);
} catch (e) {}
return;
}
function handleResponse(jqXHR, textStatus, onSuccess, onError, onRetry) {
var ret = null;
var reterr = null;
try {
if (textStatus == "error") {
var errmsg = $.msajax.defaultErrorMessage || "Error retreiving data.";
if (jqXHR.status >= 300 && jqXHR.status < 600) {
return logError( jqXHR.statusText || msg, onError, jqXHR);
}
if (tries++ < 5) return onRetry();
return logError( msg, onError, jqXHR);
}
tries = 0;
if (jqXHR.responseText.indexOf("|pageRedirect||") > 0) {
location.href = decodeURIComponent(jqXHR.responseText.split("|pageRedirect||")[1].split("|")[0]).split('?')[0];
return;
}
ret = ((JSON && JSON.parseAjax) || $.parseJSON)(jqXHR.responseText);
if (!ret) throw jqXHR.responseText;
if (ret.d) ret = ret.d;
reterr = (ret && (ret.error || ret.Error)) || null;
if (ret && ret.ExceptionType) {
reterr = ret
}
} catch (err) {
reterr = {
'Message': $.msajax.defaultErrorMessage || "Error retreiving data."
,'debug': err
}
}
if (reterr) {
logError(reterr, onError, jqXHR);
return;
}
onSuccess(ret, jqXHR);
}
} (jQuery));
注意:我还有一个JSON.parseAjax方法,是从json.org的JS文件修改而来的,它增加了对MS“/Date(...)/”日期的处理...
修改后的json2.js文件未包含在内,它在IE8的情况下使用基于脚本的解析器,因为在扩展数组和/或对象原型等情况下,本地解析器会出现错误。
我一直在考虑改进这段代码以实现promises接口,但它对我来说已经非常有效。
JSON.stringify(data)
。 - dragon