Awesomium Wpf WebControl читает ответ json от службы wcf

Что я хочу сделать, так это просто передать ответ Json от службы Wcf на Wpf WebControl. Я протестировал службу Wcf как работающую и вижу ответ Json в клиенте REST.

Я в основном попробовал два подхода (спасибо щедрым разработчикам, которые делятся своим кодом здесь):

Ниже описано, как мой Resource Interceptor создает ResourceResponse. Из документов ResourceResponse - это просто оболочка вокруг необработанного блока данных и указанного типа MIME. Это должно означать, что я должен быть в состоянии передать свой ответ вместе с contentType, и awesomium должен его распознать. Но мой ajax-запрос все попадает в "Ошибка" без содержания в jqXHR:-

private ResourceResponse readWebResponse(HttpWebRequest webreq)
    {
        HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;
        HttpWebResponse webresp = null;// = webreq.GetResponse() as HttpWebResponse;
        var memStream = new MemoryStream();
        Stream webStream;
            try
            {
                webresp = (HttpWebResponse)webreq.GetResponse();
                webStream = webresp.GetResponseStream();
                byte[] readBuffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = webStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    memStream.Write(readBuffer, 0, bytesRead);
            }
            catch (WebException e)
            {
                var r = e.Response as HttpWebResponse;
                webStream = r.GetResponseStream();
                memStream = Read(webStream);
                var wrongLength = memStream.Length;
            }


            memStream.Position = 0;
            StreamReader sr = new StreamReader(memStream);
            string webStreamContent = sr.ReadToEnd();

            byte[] responseBuffer = Encoding.UTF8.GetBytes(webStreamContent);

            // Initialize unmanaged memory to hold the array.
            int responseSize = Marshal.SizeOf(responseBuffer[0]) * responseBuffer.Length;
            IntPtr pointer = Marshal.AllocHGlobal(responseSize);
            try
            {
                // Copy the array to unmanaged memory.
                Marshal.Copy(responseBuffer, 0, pointer, responseBuffer.Length);
                return ResourceResponse.Create((uint)responseBuffer.Length, pointer,webresp.ContentType);
            }
            finally
            {
                // Data is not owned by the ResourceResponse. A copy is made 
                // of the supplied buffer. We can safely free the unmanaged memory.
                Marshal.FreeHGlobal(pointer);
                webStream.Close();
            }
    }

Мой запрос Ajax прост, как показано ниже:

   $.ajax({
   url:urlBase+'/list'
   ,success: function(dt){deferred.resolve(dt);alert('hurray')},
   error: function(jqXHR, textStatus, errorThrown ){
   alert('oyei oyei something went wrong'+JSON.stringify(jqXHR));
   var err = eval('(' + xhr.responseText + ')');
   alert(err.Message);}
   });

Что я получаю:

{"ReadyState":0,"responseText":"", состояние: 0, "его статус": "ошибка"}

В моем запросе Javascript я просто назвал приведенную выше утилиту так:

uScriptHelper.xmlHttpRequest({url:urlBase+'/list', onload=function(){return(this.responseText);}});

Я вижу, что responseText устанавливается скриптами пользователей. Но мой ответ на ajax все тот же - результат ошибки со всеми пустыми параметрами. Что я здесь не так делаю?

1 ответ

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

Первое, что есть:-

  • Подход Resource Interceptor не работает для ответа Json для Awesomium WebControl. Независимо от того, что я пытался применить все типы пантомимы к ResourceResponse Awesomium WebControl, это никуда не привело меня. Приведенный выше код предназначен для тех, кто хотел бы изучить его дальше. Я не очень уверен, какой заголовок мне здесь не хватает. Кроме того, хорошие новости:

  • Подход Awesomium JSObject, как упомянуто в работах выше. Итак, все, что нам нужно сделать здесь, это создать собственный JSObject, эмулирующий объект xmlHttpRequest, как в посте выше. Пока Javascript разговаривает с Javascript, у нас все хорошо. (ResourceResponse, кажется, враждебен запросам ajax). Итак, вот, наконец, как мне удалось заставить его работать.

Вот моя Фабрика - использует обещание Jquery и вызывает объект эмуляции xmlHttpRequest, как мы создали выше:-



    todoFactory.getTodos = function () {
    var deferred = $.Deferred();
        uScriptHelper.xmlHttpRequest({ 
            url: urlBase + '/list', method: 'get', 
            onload: function (obj) {deferred.resolve(JSON.parse(obj.responseText)); } 
        });
    return(deferred.promise());
    };

И вот мой контроллер, вызывающий вышеупомянутую фабрику:



    var promise=  todoFactory.getTodos();
        promise.then(function (data) {
            setInterval(function () {
                $scope.todos = data;
                $scope.$apply();
            }, 10);
        },function (error) {
            $scope.status = 'Unable to load todo data: ' + error;
            alert('unable to load data '+error);
        }, function (update) {
            alert('Got notification: ' + update);
        });

Надеюсь, это поможет кому-то в какой-то момент! Удачного кодирования!

Другие вопросы по тегам