JayRock Прерывистые пропущенные значения

У меня проблема с JayRock, когда я периодически получаю ошибки Missing Value.

Я не могу воссоздать ошибку, но она возникает в производстве около 100-150 раз в день (из десятков тысяч запросов).

После расследования было обнаружено, что в запросах, которые не выполняются, в HTTP-запросе отсутствует элемент [RequestBody].

Обычно это будет выглядеть так:

[Urlfield]

[RequestBody] {"id": 1, "method": "getAllAirports", "params":[]}

[печенье]

Но в тех случаях, когда это не сработало, запрос содержит:

[Urlfield]

[печенье]

Я использую прокси JayRock по умолчанию, и с помощью тестовой страницы запросы всегда работают.

Кто-нибудь сталкивался с этим раньше? Или есть какие-нибудь идеи?

Большое спасибо,

Iain

ОБНОВЛЕНИЕ: Глядя на данные, в IE это кажется исключительно ошибкой, с ошибками в IE7, 8, 9 и 10. Хотя 8 имеет гораздо больше ошибок, даже если его трафик сопоставим с 9 и меньше 10.

1 ответ

Похоже, проблема с анализом от Jayrock http://jayrock.googlecode.com/hg/src/Jayrock.Json/Json/JsonTextReader.cs

private JsonToken Parse()
    {
        char ch = NextClean();

        //
        // String
        //

        if (ch == '"' || ch == '\'')
        {
            return Yield(JsonToken.String(NextString(ch)));
        }

        //
        // Object
        //

        if (ch == '{')
        {
            _reader.Back();
            return ParseObject();
        }

        //
        // Array
        //

        if (ch == '[')
        {
            _reader.Back();
            return ParseArray();
        }

        //
        // Handle unquoted text. This could be the values true, false, or
        // null, or it can be a number. An implementation (such as this one)
        // is allowed to also accept non-standard forms.
        //
        // Accumulate characters until we reach the end of the text or a
        // formatting character.
        // 

        StringBuilder sb = new StringBuilder();
        char b = ch;

        while (ch >= ' ' && ",:]}/\\\"[{;=#".IndexOf(ch) < 0) 
        {
            sb.Append(ch);
            ch = _reader.Next();
        }

        _reader.Back();

        string s = sb.ToString().Trim();

        if (s.Length == 0)
            throw SyntaxError("Missing value.");


        //
        // Boolean
        //

        if (s == JsonBoolean.TrueText || s == JsonBoolean.FalseText)
            return Yield(JsonToken.Boolean(s == JsonBoolean.TrueText));

        //
        // Null
        //

        if (s == JsonNull.Text)
            return Yield(JsonToken.Null());

        //
        // Number
        //
        // Try converting it. We support the 0- and 0x- conventions. 
        // If a number cannot be produced, then the value will just
        // be a string. Note that the 0-, 0x-, plus, and implied 
        // string conventions are non-standard, but a JSON text parser 
        // is free to accept non-JSON text forms as long as it accepts 
        // all correct JSON text forms.
        //

        if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
        {
            if (b == '0' && s.Length > 1 && s.IndexOfAny(_numNonDigitChars) < 0)
            {
                if (s.Length > 2 && (s[1] == 'x' || s[1] == 'X'))
                {
                    string parsed = TryParseHex(s);
                    if (!ReferenceEquals(parsed, s))
                        return Yield(JsonToken.Number(parsed));
                }
                else
                {
                    string parsed = TryParseOctal(s);
                    if (!ReferenceEquals(parsed, s))
                        return Yield(JsonToken.Number(parsed));
                }
            }
            else
            {
                if (!JsonNumber.IsValid(s))
                    throw SyntaxError(string.Format("The text '{0}' has the incorrect syntax for a number.", s));

                return Yield(JsonToken.Number(s));
            }
        }

        //
        // Treat as String in all other cases, e.g. when unquoted.
        //

        return Yield(JsonToken.String(s));
    }
Другие вопросы по тегам