【问题标题】:Awesomium Wpf WebControl read json response from wcf serviceAwesomium Wpf WebControl 从 wcf 服务读取 json 响应
【发布时间】:2014-10-31 14:38:33
【问题描述】:

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

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

下面是我的 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":"",status:0,"statusText":"error"}

在我的 Javascript 请求中,我只是像这样调用了上述实用程序:-

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

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

【问题讨论】:

    标签: c# ajax wpf wcf awesomium


    【解决方案1】:

    唷,经过将近 4 天的各种尝试,我终于成功了。我会在这里添加答案,希望它会在某个时间点对某人有所帮助。

    第一件事是:-

    • 资源拦截器方法不适用于 Awesomium WebControl 的 Json 响应。不管我尝试将所有 mime 类型应用于 Awesomium WebControl 的 ResourceResponse ,它都没有带我去任何地方。上面的代码可供任何想要进一步探索它的人使用。我不太确定我在这里缺少什么标题。此外,好消息是:-

    • 上述帖子中提到的 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);
            });
    
    

    希望这在某些时候可以帮助某人!快乐编码!

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多