2016-03-23 11 views
7

Desidero inviare un oggetto da un controller WebApi a una pagina HTML tramite una richiesta Ajax.Protobuf: WebApi -> JS - L'oggetto decodificato è vuoto

Quando ricevo l'oggetto in JS, è vuoto. Ma sul lato server l'oggetto non è vuoto perchè quando guardo il byte[].length è maggiore di 0.

  • lato server, io uso il dll provided by Google.
  • lato JS, io uso il ProtobufJS library. Questo è il mio .proto di file: Codice

    syntax="proto3"; 
    
    message Container { 
        repeated TestModel2 Models = 1; 
    } 
    
    message TestModel2 { 
        string Property1 = 1; 
        bool Property2 = 2; 
        double Property3 = 3; 
    } 
    
    • Server:

      var container = new Container(); 
      
      var model = new TestModel2 
      { 
          Property1 = "Test", 
          Property2 = true, 
          Property3 = 3.14 
      }; 
      

      container.Models.Add (modello); Dati

    • Base64:

    ChEKBFRlc3QQARkfhetRuB4JQA ==

    • JS decodifica:

      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); 
      
    • oggetto Risultato in console JS :

      { 
          "Models": [] 
      } 
      
    • bytebuffer.js

    • protobuf.js V5.0.1
+1

Quindi la richiesta ha successo, soltanto - l'oggetto che ricevete è vuoto? Prova a eseguire la richiesta direttamente nel browser e visualizza l'output e quindi condividi l'output con noi :) – KDOT

+0

Sembra che quando JS decodifica il messaggio, l'oggetto sia o vuoto o il processo di decodifica non possa riuscire, quindi ottengo il valore predefinito stato oggetto Cosa intendi con "esecuzione della richiesta direttamente nel browser"? – Guillaume

+0

Ok se non sei sicuro se è solo vuoto o il processo di decodifica non sta completando - rimuovi il processo di decodifica e solo 'console.log' la risposta.Se non è vuoto, possiamo passare attraverso il processo di decodifica. Dobbiamo vedere l'errore perché non possiamo eseguire il debugging per te. Suppongo che tu non stia eseguendo l'autenticazione delle intestazioni sulle richieste con le chiavi, quindi se è così, dovresti essere in grado di richiederle direttamente tramite l'URL come vedere la risposta assoluta che la richiesta * AJAX * otterrebbe, quindi lavorare da lì. Questo presuppone che questa API sia stata costruita anche da te. – KDOT

risposta

2

Infine ho risolto il problema da solo.

Era il lato client che era in errore.

  • Infatti il ​​xhr.response è formato JSON così è stato tra doppi apici "ChEKBFRlc3QQARkfhetRuB4JQA==". Ho dovuto JSON.parse la mia risposta. enter code here
  • ho rimosso il xhr.responseType = "arraybuffer";

Ecco il mio codice ora:

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);