Javascript Protobuf:WebApi->;JS-解码的对象为空

Javascript Protobuf:WebApi->;JS-解码的对象为空,javascript,asp.net-web-api,protocol-buffers,protobuf.js,Javascript,Asp.net Web Api,Protocol Buffers,Protobuf.js,我想通过Ajax请求将对象从WebApi控制器发送到Html页面 当我收到JS中的对象时,它是空的。但是服务器端的对象不是空的,因为当我查看字节[].length时,它大于0 服务器端,我使用 在JS方面,我使用了。这是我的.proto文件: syntax="proto3"; message Container { repeated TestModel2 Models = 1; } message TestModel2 { string Property1 = 1;

我想通过
Ajax
请求将对象从
WebApi
控制器发送到Html页面

当我收到JS中的对象时,它是空的。但是服务器端的对象不是空的,因为当我查看
字节[].length时,它大于0

  • 服务器端,我使用
  • 在JS方面,我使用了。这是我的
    .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

    • 最后我自己解决了这个问题

      是客户端出了错

      • 实际上,
        xhr.response
        是JSON格式的,所以它是在双引号之间的
        “ChEKBFRlc3QQARkfhetRuB4JQA==”
        。我必须解析我的响应。
        在这里输入代码
      • 我删除了
        xhr.responseType=“arraybuffer”
      这是我现在的代码:

      var ProtoBuf = dcodeIO.ProtoBuf;
      var xhr = ProtoBuf.Util.XHR();
      xhr.open(
          /* method */ "GET",
          /* file */ "/XXXX/Protobuf/GetProtoData",
          /* async */ true
      );
      // xhr.responseType = "arraybuffer"; <--- Removed
      xhr.onload = function (evt) {
          var testModelBuilder = ProtoBuf.loadProtoFile(
              "URL_TO_PROTO_FILE",
              "Container.proto").build("Container");
          var msg = testModelBuilder.decode64(JSON.parse(xhr.response)); <-- Parse the response in JSON format
          console.log(msg); // Correctly decoded
      }
      xhr.send(null);
      
      var ProtoBuf=dcodeIO.ProtoBuf;
      var xhr=ProtoBuf.Util.xhr();
      xhr.open(
      /*方法*/“获取”,
      /*文件*/“/XXXX/Protobuf/GetProtoData”,
      /*异步*/true
      );
      
      //xhr.responseType=“arraybuffer”;所以你的请求成功了,只是-你收到的对象是空的?尝试直接在浏览器中运行请求并查看输出,然后与我们共享您的输出:)似乎当JS解码消息时,对象是空的或空的,或者解码过程无法成功,因此我得到默认状态对象“直接在浏览器中运行请求”是什么意思?当我
      console.log
      响应时,我获得了这个
      ArrayBuffer{}
      ,因此我假设响应是空的。但是在服务器端,当我在
      byte[]
      中序列化对象时,长度大于0,我可以反序列化它,并且它不是空的。另外,在Chrome控制台中,ajax的响应是
      ChEKBFRlc3QQARkfhetRuB4JQA==
      我投了赞成票,所以你的问题会被看到,我不擅长JavaScript,所以任何客户端代码,我都是无用的。只要你接收到你的对象并且它包含一些东西,我相信如果他们也看一下这些评论,你会得到一个解决方案。祝你好运,你可能想赏金,因为这是一个大多数人都会读到的深度问题。不过,我希望你能找到解决办法!好的,我明白了。我想我的代码中有一个愚蠢的错误,但我不知道在哪里。无论如何,谢谢你的帮助!