JSONP + ASP.NET - ответ неполон - PullRequest
       15

JSONP + ASP.NET - ответ неполон

0 голосов
/ 25 ноября 2011

Мы боролись с ограничениями 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);
        */
}

Хотя, похоже, не помогло.

1 Ответ

0 голосов
/ 28 ноября 2011

Оказывается, модуль сжатия GZIPStream, который мы используем, содержит ошибки, см. Здесь: GZipStream и DeflateStream не распаковывает все байты

В настоящее время мы сняли модуль с использования, и теперь ответы возвращаются последовательно завершенными.

...