2011-10-28 7 views
5

के साथ विफल रहता है मैं JSON डेटा को एएसपी.नेट एमवीसी 2 सर्वर पर पोस्ट कर रहा हूं। मैं बड़े JSON तारों को पोस्ट कर रहा हूं (जिसमें बेस 64-एन्कोडेड फ़ाइल स्ट्रीम शामिल है, स्थानीय फ़ाइल सिस्टम से पढ़ा जाता है)। JQuery AJAX कॉल लगभग 2.5 एमबी के आकार के आकार के लिए ठीक काम करता है। एक बार इस आकार से ऊपर AJAX कॉल विफल रहता है (नियंत्रक को कभी नहीं मिलता है)। मैं बिल्कुल पता नहीं लगा सकता कि त्रुटि क्या है - यह त्रुटि चर को पॉप्युलेट नहीं करता है।jQuery .ajax पोस्ट बड़े JSON ऑब्जेक्ट

ajax कॉल इस प्रकार है:

$.ajax({ 
      type: "POST", 
      dataType: 'json', 
      timeout: 10000, 
      url: "/Molecule/SaveMolecule", 
      data: { jsonpost: postdata, moleculetype: _moleculeType, moleculefilestream: _moleculefilestream, changedproducts: stringifiedChangedProducts }, // NOTE the moleculeType being added here 
      success: function (data) { 
       if (data.rc == "success") { 
        $.log('ServerSuccess:' + data.message); 

        molecule_updateLocalInstance(); 

        _bMoleculeIsDirty = false; 
        if (bReturnToMoleculeList != null && bReturnToMoleculeList == true) { 
         navigator_Go('/Molecule/Index/' + _moleculeType); 
        } 
        else { 
         _saveMoleculeButtonFader = setTimeout(function() { 

          $('#profilesave-container').delay(500).html('<img src="/content/images/tick.png" width="32px" height="32px" /><label>' + _moleculeSingularTerm + ' was saved</label>').fadeIn(500); 

          _saveMoleculeButtonFader = setTimeout(function() { $('#profilesave-container').fadeOut(1000); }, 2000); 

         }, 500); 
        } 

       } else { 
        $.log('ServerUnhappy:' + data.message); 
        RemoveMoleculeExitDialog(); 
       } 
      } 
      , error: function (jqXHR, textStatus, errorThrown) { 
       alert('Save failed, check console for error message:' +textStatus+' '+ errorThrown); 
       MarkMoleculeAsDirty(); 
       $.log('Molecule Save Error:' + helper_objectToString(textStatus+' '+errorThrown)); 
      } 
     }); 

जहां _moleculefilestream बड़े बेस 64 एन्कोडेड धारा है।

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

कोई भी किसी भी उज्जवल विचार मिल गया:

मेरे web.config में निम्नलिखित शामिल हैं?

उत्तर

1

httpRuntime की maxRequestLength संपत्ति सेट करने का प्रयास करें।

http://msdn.microsoft.com/en-us/library/e1f13641.aspx

तुम बस नियंत्रक/कार्रवाई की जरूरत में कोई स्थान टैग के माध्यम से यह निर्धारित कर सकते हैं।

+0

यह चाल है - धन्यवाद! – Journeyman

1

क्या आपने टाइमआउट को समायोजित करने का प्रयास किया है? 10 सेकंड 2.5 एमबी के लिए पर्याप्त हो सकता है लेकिन अधिक नहीं।

+0

टिप एरिक के लिए धन्यवाद - मैं स्थानीय रूप से इसका परीक्षण कर रहा हूं, इसलिए 10s बड़ी फ़ाइलों के लिए बहुत कुछ है, लेकिन मैं लाइव वातावरण के लिए अपना मुद्दा लेता हूं और तदनुसार टाइमआउट को टक्कर दूंगा। – Journeyman

1

अद्यतन

एक spnet:MaxJsonDeserializerMembers तत्व अपने web.config फ़ाइल के <appSettings> अनुभाग में जोड़ा जाना चाहिए, जो एक Int32 डेटा प्रकार का अधिकतम मान के बराबर है के लिए सेटिंग।

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

आधिकारिक documentation के इस पृष्ठ में, आप तत्वों के बारे में सभी जानकारी के साथ-साथ उनके उपयोग को खोजने के लिए सक्षम हो जाएगा।

नोट: आधिकारिक दस्तावेज के अनुभाग में यह अनुशंसा की जाती है कि अधिकतम मूल्य को समायोजित न करें क्योंकि यह सुरक्षा जोखिम का प्रतिनिधित्व करता है। आदर्श रूप में, आपको उन वस्तुओं की संख्या की जांच करनी चाहिए जिन्हें आप deserialize करना चाहते हैं और अधिकतम जेसन आकार के आधार पर अनुमान लगाने का प्रयास करें।

@Flxtr द्वारा

मूल पोस्ट: Here

पुराने

आप कोई फ़ाइल अपलोड करना चाहते हैं, क्यों नहीं FormData

उदाहरण के लिए उपयोग करने का प्रयास:

function getDataForm() { 

    var data = new FormData(); 

    var files = fileUploader.get(0).files; 
    if (files.length > 0) { 
     data.append("File", files[0]); 
    } 
    data.append("ImagePath", ""); 

    data.append("Id", ImageId); 
    data.append("Name", txtName.val().trim()); 
    data.append("Description", txtDescription.val().trim()); 

    return data; 
} 

function save(data) { 
    $.ajax({ 
     type: "POST", 
     url: "/Files/SaveImage", 
     contentType: false, 
     processData: false, 
     data: data, 
     success: function (response) { 

      if (response.success) { 
       $.showMessage(messages.NAME, messages.SUCCESS, "success"); 
       closeForm(); 
       Files.ImageList.gridImages.ajax.reload(); 
      } 
      else { 
       $.showMessage(messages.NAME, response.message, "error"); 
      }; 

      btnSave.button('reset'); 
     }, 
     error: function (request, status, exception) { 
      $.showMessage(messages.NAME, exception, "error"); 
      btnSave.button('reset'); 
     } 
    }); 
}; 

फिर , सर्वर की ओर, वेब कॉन्फ़िगरेशन में अनुरोध लंबाई बदलें:

<httpRuntime targetFramework="4.6.1" maxRequestLength="65536"/> 

उदाहरण के लिए:

<system.web> 
    <compilation debug="true" targetFramework="4.6.1" /> 
    <httpRuntime targetFramework="4.6.1" maxRequestLength="65536"/> 
    <customErrors mode="RemoteOnly"> 
     <error statusCode="401" redirect="/Error/401" /> 
     ... 
     <error statusCode="411" redirect="/Error/411" /> 
    </customErrors> 
    </system.web> 

इसके अलावा, ajax अनुरोध में false पैरामीटर processData बदलने के लिए:

$.ajax({ 
    url: "/Security/SavePermissions", 
    type: "POST", 
    processData: false, 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(pStrPermissions), 
    success: function (response) { 
     if (response.success) { 
      panel.showAlert("Permisos", "Se han actualizado correctamente los permisos.", "success"); 
      resetForm(); 
     } 
     else { 
      $.showMessage("Permisos", response.message, "error"); 
     }; 
    }, 
    error: function (request, status, exception) { 
     $.showMessage("Permisos", exception, "error"); 
    } 
}); 

ये केवल सुझाव हैं। वास्तव में मेरे लिए काम करने वाली एकमात्र चीज सूची को क्रमबद्ध करना और सर्वर पर इसे deserialize करना था।

उदाहरण के लिए, ग्राहक के पक्ष:

function savePermissions(pLstObjPermissions) { 
    $.ajax({ 
     url: "/Security/SavePermissions", 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify({ pStrPermissions: JSON.stringify(pLstObjPermissions)}) , 
     success: function (response) { 
      if (response.success) { 
       panel.showAlert("Permisos", "Se han actualizado correctamente los permisos.", "success"); 
       resetForm(); 
      } 
      else { 
       $.showMessage("Permisos", response.message, "error"); 
      }; 
     }, 
     error: function (request, status, exception) { 
      $.showMessage("Permisos", exception, "error"); 
     } 
    }); 
}; 

सर्वर साइड पर:

public ActionResult SavePermissions(string pStrPermissions) 
{ 
    var lLstObjResult = new Dictionary<string, object>(); 

    try 
    { 
     SecurityFactory.GetPermissionService().UpdateList(JsonConvert.DeserializeObject<IList<Permission>>(pStrPemissions)); 
     lLstObjResult.Add(MESSAGE, "Registro guardado exitosamente"); 
     lLstObjResult.Add(SUCCESS, true); 
    } 
    catch (Exception e) 
    { 
     lLstObjResult.Add(MESSAGE, e.Message); 
     lLstObjResult.Add(SUCCESS, false); 
    } 

    return Json(lLstObjResult, JsonRequestBehavior.AllowGet); 
} 

मुझे पता है कि यह सबसे अच्छा तरीका है नहीं है, लेकिन जब तक कुछ बेहतर साथ आता है यह काम करता है।

यदि आपके पास इस समस्या को हल करने का एक बेहतर तरीका है, तो कृपया इसे साझा करें।