Проблема потока JSON HTTP-модуля - PullRequest
0 голосов
/ 12 марта 2010

У меня есть HTTP-модуль, который я использую для очистки JSON, возвращенного моим веб-сервисом (см. Пример http://www.codeproject.com/KB/webservices/ASPNET_JSONP.aspx?msg=3400287#xx3400287xx). В основном это относится к вызову междоменных веб-сервисов JSON из javascript.

Существует этот JsonHttpModule, который использует класс Stream JsonResponseFilter для записи JSON, а перегруженный метод Write должен обернуть имя функции обратного вызова вокруг JSON, в противном случае JSON выдает ошибку, поскольку требует метки. Однако, если JSON действительно длинный, метод Write в классе Stream вызывается несколько раз, в результате чего функция обратного вызова неправильно вставляется в середине JSON. Есть ли в классе Stream способ обернуть функцию обратного вызова в конце потока или указать, что он записывает весь метод JSON в 1 Write, а не в чанки ??

Вот где он вызывает JsonResponseFilter в Модуле JsonHttp:

public void OnReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;

            if (!_Apply(app.Context.Request)) return;

            // apply response filter to conform to JSONP
            app.Context.Response.Filter =
                new JsonResponseFilter(app.Context.Response.Filter, app.Context);
        }

Вот метод Write в классе Stream JsonResponseFilter, который вызывается несколько раз:

public override void Write(byte[] buffer, int offset, int count)
        {
            var b1 = Encoding.UTF8.GetBytes(_context.Request.Params["callback"] + "(");
            _responseStream.Write(b1, 0, b1.Length);

            _responseStream.Write(buffer, offset, count);

            var b2 = Encoding.UTF8.GetBytes(");");
            _responseStream.Write(b2, 0, b2.Length);
        }

Спасибо за любую помощь! Джастин

Ответы [ 2 ]

0 голосов
/ 10 августа 2012

Другое решение - написать ResponseStream в методе Flush. Как в этом примере.

Я изменил метод JsonHttpModules Flush и использовал StringBuilder для хранения потока в методе записи, как Джастин.

    /// <summary>
    /// Override flush by writing out the cached stream data
    /// </summary>
    public override void Flush()
    {

        if (_sb.Length > 0)
        {
            string message = _context.Request.Params["callback"] + "(" + _sb.ToString() + ");";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message);
            _responseStream.Write(buffer, 0, buffer.Length);
        }

        // default flush behavior
        _responseStream.Flush();
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        string json = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
        _sb.Append(json);
    }

Таким образом, вам не нужно пытаться угадать конец входящего потока.

0 голосов
/ 12 марта 2010

Причина, по которой метод запускается несколько раз, заключается в том, что он буферизует содержимое и затем отправляет его в выходной поток. Вот пример, который показывает, как создать движок ViewState HttpModule. Вы можете получить некоторую идею от реализации. Прокрутите вниз до дна и увидите результат.

http://www.highoncoding.com/Articles/464_Filtering_Responses_Using_ASP_NET_Response_Filters.aspx

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