2014-10-31 90 views
0

我想要做的仅仅是将Wcf服务的Json响应提供给Wpf WebControl。我已经测试了Wcf服务,并且可以在REST客户端中看到Json响应。Awesomium Wpf WebControl从wcf服务读取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的”: “”,状态:0, “状态文本”: “错误”}

在我的JavaScript请求我简单地称为上面这样的工具: -

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

我可以看到这个responseText正在被Userscripts设置。但是我的ajax响应仍然是一样的 - 错误导致所有空参数。我在这里做错了什么?

回答

0

Phew,我终于在尝试各种东西后花了近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); 
     }); 

希望这可以帮助某个人!快乐编码!