我们一直在努力解决ASP.NET试图让JSONP正常工作的问题。我们试图检查一个文件是否存在于不同的服务器上并返回一个布尔值。该函数在jquery的ready()函数上调用,因此它应该在加载所有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);
*/
}
虽然似乎没有帮助。
答案 0 :(得分:0)
事实证明我们使用的GZIPStream压缩模块是错误的,请参见此处:GZipStream And DeflateStream will not decompress all bytes
我们暂时将模块从使用中移除,现在响应一直都是完整的。