真棒Wpf WebControl从wcf服务读取json响应

本文关键字:读取 json 响应 服务 wcf Wpf WebControl 真棒 | 更新日期: 2023-09-27 18:28:41

我想做的只是将Json响应从Wcf服务提供给Wpf WebControl。我已经测试了Wcf服务的工作情况,并且可以在REST客户端中看到Json响应。

我基本上尝试了两种方法(感谢慷慨的开发人员在这里分享他们的代码):-

  • 资源拦截器如何在Awesomium中隐藏光标

下面是我的ResourceInterceptor如何构建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,"statusText":"error"}

  • 我还尝试过从这里使用Userscript方法:-http://answers.awesomium.com/questions/2289/can-i-use-userscripts-or-greasemonkey-scripts-in-a.html

在我的Javascript请求中,我简单地调用了上面的实用程序,如下所示:-

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

我可以看到responseText是由用户脚本设置的。但我的ajax响应仍然是一样的——所有参数都为空的错误结果。我在这里做错了什么?

真棒Wpf WebControl从wcf服务读取json响应

Phew,经过近4天的各种尝试,我终于成功了。我将在这里添加答案,希望它能在某个时候帮助到某人。

第一件事是:-

  • 资源拦截器方法不适用于Json对Awesomium WebControl的响应。无论我如何尝试将所有mime类型应用到Awesomium WebControl的ResourceResponse,它都没有让我取得任何进展。上面的代码是为任何想进一步探索它的人准备的。我不太确定我缺了什么头球。此外,好消息是:-

  • 上述帖子中提到的Awesomium JSObject方法行之有效。因此,我们在这里所需要做的就是创建自定义的JSObject来模拟上面文章中的xmlHttpRequest对象。只要Javascript与Javascript对话,我们就没事。(ResourceResponse似乎对ajax请求怀有敌意)。所以,我终于做到了这一点。

这是我的工厂-使用Jquery promise并调用上面创建的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);
        });

希望这能在某个时候帮助到别人!快乐编码!