我想要做的只是将Wcf响应从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的”: “”,状态:0, “状态文本”: “错误”}
在我的Javascript请求中,我只是简单地调用上面的实用程序: -
uScriptHelper.xmlHttpRequest({url:urlBase+'/list', onload=function(){return(this.responseText);}});
我可以看到responseText是由Userscripts设置的。但我的ajax响应仍然完全相同 - 所有空参数的错误结果。我在这里做错了什么?
答案 0 :(得分:0)
首先是: -
资源拦截器方法对于Awesomium WebControl的Json响应不起作用。无论我尝试将所有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);
});
希望这在某些方面帮助某人!快乐的编码!