2014-10-31 71 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); 
     }); 

希望這可以幫助某個人!快樂編碼!