2013-09-04 3 views
5

Sto utilizzando il pluggin di mappatura di KnockoutJS per convertire il mio modello in oggetti Knockout. Ma sto riscontrando problemi nell'invio del grande oggetto json al server. La mia chiamata AJAX si presenta così:Pubblicazione di un oggetto JSON di grandi dimensioni su ASP.NET MVC

$.ajax({ 
    url: "/home/DoStuff", 
    type: "POST", 
    data: JSON.stringify({ deal: ko.toJS(myObjectViewModel) }), 
    contentType: "application/json", 
    dataType: "json", 
    success: function (result) { 
     console.log(result); 
    }, 
    error: function (xhr, status, message) { 
     console.log(xhr); 
    } 
}); 

L'esecuzione di questo script non colpisce l'azione DoStuff nel controller. Quando ispeziono con Firebug, il POST continua a girare. Nella scheda Rete di Firebug, il corpo postale è 159,9 KB e il Totale inviato è 165,1 KB (comprese le intestazioni). Se è stato inviato, perché non colpisce il mio punto di interruzione nel codice?

Ma quando invio invece solo una proprietà di myObjectViewModel, pubblica post e tutto ha esito positivo. Quindi questo mi porta ad assumere il problema sia con la dimensione dei dati che vengono pubblicati. Così ho provato ad aumentare il maxJsonLength.

<system.web.extensions> 
    <scripting> 
     <webServices> 
      <jsonSerialization maxJsonLength="2147483644"></jsonSerialization> 
     </webServices> 
    </scripting> 
</system.web.extensions> 

Questo non ha aiutato.

C'è qualcos'altro che dovrei fare?

risposta

7

Suppongo che il mio oggetto abbia superato il numero massimo di membri che ASP.NET è stato autorizzato a deserializzare. Ho aggiunto il sotto per aumentarlo e funziona.

<appSettings> 
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> 
</appSettings> 

UPDATE: Quindi non c'era più ad esso perché dopo ho capito di lavoro, alla fine sarebbe smettere di lavorare per quello che sembra essere senza motivo. Firebug avrebbe di nuovo mostrato che il post girava senza che questo colpisse il codice sul back-end. Solo dopo aver chiuso Firefox, ucciso il processo IIS Express e chiuso Visual Studio, il post ha iniziato a funzionare di nuovo. Ma chiudere VS sembra essere la chiave. Dopo averlo riavviato, cambiando il codice e rieseguendo l'app, il problema si ripresenta. Quando si verifica il problema, nemmeno un aggiornamento rigido caricherà la pagina. Si siederà lì a girare. La pagina verrà ricaricata solo dopo aver eliminato il processo IIS Express e rieseguito da VS.

Quindi ho scaricato IIS Express e ho utilizzato IIS completo sulla mia macchina. Sembra che questo risolva il problema. Pubblicare i dati json di grandi dimensioni passa attraverso ogni volta senza errori ... anche dopo aver cambiato codice e ricompilato.

IIS Express sembra gestire la pubblicazione di piccole quantità di json, ma soffoca su set più grandi. Non ho provato abbastanza a fondo per confermarlo al 100%, ma so che le prestazioni sono più affidabili con IIS completo. Tuttavia, non hanno testato il web server interno di VS.

Ambiente: Windows 8, Visual Studio 2012 Update 3

2

Potrebbe essere necessario sbattere il generico maximum request length (in kilobyte, esempio è 1 GB)

<configuration> 
    <system.web> 
    <httpRuntime maxRequestLength="1048576" /> 
    </system.web> 
</configuration> 

E se si sta utilizzando IIS 7, probabilmente urtare max content length (in byte, esempio è 1 GB)

<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="1073741824" /> 
    </requestFiltering> 
    </security> 
</system.webServer> 
+0

sto usando IIS Express. Grazie, ho provato entrambi ma non è ancora arrivato al server. – nthpixel

0

Ho avuto lo stesso problema di pubblicazione dei dati del modello di oggetti di grandi dimensioni (JSON) dal lato client per azione del controller Server. aggiungendo le impostazioni di sotto alla configurazione funzionava bene. Grazie.

<appSettings> 
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> 
</appSettings> 
2

sto passando i dati JSON grande che contiene quasi 1,50,00,000 caratteri a mio controller, con il cambiamento di seguito in web.config:

<appSettings> 
    <add key="aspnet:MaxJsonDeserializerMembers" value="2147483644" /> 
</appSettings> 

Questo sta lavorando per me molto bene .....