【发布时间】:2016-07-10 11:45:14
【问题描述】:
我想通过Ajax 请求将对象从WebApi 控制器发送到Html 页面。
当我在 JS 中收到对象时,它是空的。但服务器端的对象不是空的,因为当我查看byte[].length 时,它大于 0。
- 服务器端,我用dll provided by Google。
-
JS 方面,我用的是ProtobufJS library。这是我的
.proto文件:syntax="proto3"; message Container { repeated TestModel2 Models = 1; } message TestModel2 { string Property1 = 1; bool Property2 = 2; double Property3 = 3; }-
服务器代码:
var container = new Container(); var model = new TestModel2 { Property1 = "Test", Property2 = true, Property3 = 3.14 };container.Models.Add(model);
Base64 数据:
ChEKBFRlc3QQARkfhetRuB4JQA==
-
JS解码:
var ProtoBuf = dcodeIO.ProtoBuf; var xhr = ProtoBuf.Util.XHR(); xhr.open( /* method */ "GET", /* file */ "/XXXX/Protobuf/GetProtoData", /* async */ true ); xhr.responseType = "arraybuffer"; xhr.onload = function (evt) { var testModelBuilder = ProtoBuf.loadProtoFile( "URL_TO_PROTO_FILE", "Container.proto").build("Container"); var msg = testModelBuilder.decode64(xhr.response); console.log(JSON.stringify(msg, null, 4)); // Correctly decoded } xhr.send(null); -
JS 控制台中的结果对象:
{ "Models": [] } bytebuffer.js
- protobuf.js v5.0.1
-
【问题讨论】:
-
所以你的请求是成功的,只是——你收到的Object是空的?尝试直接在浏览器中运行请求并查看输出,然后与我们分享您的输出:)
-
好像JS解码消息时,对象是or空或者解码过程不能成功所以我得到了默认的状态对象“直接在浏览器”?
-
当我
console.log得到响应时,我得到了这个ArrayBuffer {}所以我想响应是空的。但是在服务器端,当我在byte[]中序列化我的对象时,长度> 0,我能够反序列化它并且它不是空的。另外,在 Chrome 控制台中,ajax 响应是ChEKBFRlc3QQARkfhetRuB4JQA== -
我投了赞成票,所以你的问题会被看到,我不擅长 JavaScript,所以任何客户端代码,我都没用。只要您收到您的对象并且它包含一些东西,我相信如果他们也看看这些 cmets,您会得到一个解决方案。祝你好运,你可能想要赏金它,因为这是一个大多数扫描阅读的深入问题。但同样,我希望你能找到解决办法!
-
好的,我明白了。我想我的代码中有一个愚蠢的错误,但不知道在哪里。无论如何,谢谢你的帮助!
标签: javascript asp.net-web-api protocol-buffers protobuf.js