Нулевые параметры в действии MVC из ajax-вызова jQuery во время навигации (только для IE) - PullRequest
3 голосов
/ 04 января 2012

Я программист проекта MVC / ajax, который получает значительный трафик от своих клиентов.Мы видели один или два изолированных экземпляра (в день) действия контроллера, не получающего параметры от клиента.

Короче говоря: действия вызываются через jQuery ajax, а параметры действия - толькоnull, если выполняется вызов ajax, когда браузер переходит на другую страницу.IE щелкает ссылку и затем запускает вызов ajax.

Я добавил некоторую грубую проверку этих вызовов, чтобы убедиться, что мы фактически не пропускаем нули в данных ajax, и это не уменьшило проблему.Ниже приведен пример одного из вызовов.

    var searchValue = _txtSearch.val().trim();

    if (searchValue === null 
        || searchValue === undefined 
        || searchValue.length < _minimumLengthForSearch) {
        _txtSearch.focus();
        return;
    }
    // clear out the value when launching
    _txtSearch.val('');

    $.post(_quickSearchUrl,
        { searchString: searchValue },
        function (data) {...},
    "json");

Я нашел старый пост IEBlog , в котором говорится, что IE может справиться с этой ситуацией иначе, чем в других браузерах.Мне было любопытно, сталкивался ли кто-либо еще с этим явлением прежде.Опять же, я могу воспроизвести эту проблему только в IE и только во время навигации по страницам.

Редактировать: Трудно воспроизвести это исключение с активным Fiddler по какой-то причине, но когда мне удается в Fiddler, отображается следующее сообщение об ошибке:

Fiddler обнаружил нарушение протокола в сеансе # 4.Несоответствие длины содержимого: заголовок запроса указал 24 байта, но клиент отправил 0 байтов.

1 Ответ

2 голосов
/ 03 октября 2012

Используя Fiddler, я смог воспроизвести это в очень редком случае и понял, что это можно рассматривать как несоответствие длины содержимого (то есть сообщение об ошибке, которое fiddler отображает при его возникновении). В частности, на стороне сервера длина содержимого запроса не будет соответствовать фактическому содержимому Form / InputStream. Мы отвергли OnAuthorization, чтобы вручную обнаружить и обработать этот случай.

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        //Detect IE missing post data phenomenon
        var request = HttpContext.Request;
        if (request.IsAjaxRequest() == true && request.ContentLength > 0 
            && request.Form.HasKeys() == false && request.InputStream.Length == 0)
        {
            throw new ContentLengthMismatchException(string.Format("Content Length Mismatch in URL: {0}", request.Url));
        }

        base.OnAuthorization(filterContext);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...