Мы боролись с ограничениями ASP.NET, пытаясь заставить JSONP работать. Мы пытаемся проверить, существует ли файл на другом сервере и вернуть логическое значение. Функция вызывается в функции ready () jquery, поэтому это должно происходить после загрузки всех элементов DOM.
Мы использовали средство переписывания запросов / ответов HTTPModule, связанное здесь:
http://www.codeproject.com/KB/webservices/ASPNET_JSONP.aspx
звонок AJAX:
function CheckFileExists() {
var _FileID = $('#FileID').val();
var button = $('#btnViewFiles');
button.val('Checking...').css('color', '');
$.ajax({
type: "GET",
url: localAdminUrl + "WebServices.asmx/CheckFileExists",
data: { FileID: _FileID },
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
success: function (data, textStatus, jqXHR) {
if (data.d == true) {
button.attr('onClick', 'ViewFiles(_FileID,false);').removeAttr('disabled').val('View documents').css('color', '#22CA00');
} else {
button.val('No documents').css('color', '#DD3BB3').removeAttr('onClick').attr('disabled', 'disabled');
}
},
error: function (jqXHR, textStatus, errorThrown) {
button.val('Error occurred').css('color', '#DD3BB3').removeAttr('onClick').attr('disabled', 'disabled');
}
});
}
Теперь, по какой-то причине, ответ иногда решает опустить конечные скобки и точку с запятой, оставляя неполный ответ, и JSON выдает «parsererror».
пример:
jQuery<numbers>_<numbers>({"d":false}
вместо ожидаемого:
jQuery<numbers>_<numbers>({"d":false});
Непонятно, что это происходит только изредка - некоторые запросы заканчиваются и обрабатываются правильно. Что на земле происходит?
Я пытался переписать HTTPModule так, чтобы ответ записывался один раз, а не три раза:
public override void Write(byte[] buffer, int offset, int count)
{
var b1 = Encoding.UTF8.GetBytes(_context.Request.Params["callback"] + "(");
var b2 = Encoding.UTF8.GetBytes(");");
byte[] finalResponse = new byte[b1.Length + buffer.Length + b2.Length];
b1.CopyTo(finalResponse,0);
buffer.CopyTo(finalResponse, b1.Length);
b2.CopyTo(finalResponse, b1.Length + buffer.Length);
_responseStream.Write(finalResponse, 0, finalResponse.Length);
/* Old way
_responseStream.Write(b1, 0, b1.Length);
_responseStream.Write(buffer, offset, count);
var b2 = Encoding.UTF8.GetBytes(");");
_responseStream.Write(b2, 0, b2.Length);
*/
}
Хотя, похоже, не помогло.