क्या कारण है "बेस -64 चार सरणी के लिए अमान्य लंबाई"


91

मुझे यहाँ जाने के लिए बहुत कम है। मैं इसे स्थानीय रूप से पुन: पेश नहीं कर सकता, लेकिन जब उपयोगकर्ताओं को त्रुटि मिलती है तो मुझे एक स्वचालित ईमेल अपवाद सूचना मिलती है:

Invalid length for a Base-64 char array.

  at System.Convert.FromBase64String(String s)
  at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
  at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
  at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
  at System.Web.UI.HiddenFieldPageStatePersister.Load()

मुझे लगता है कि डेटा के साथ एक समस्या है जिसे देखने के लिए सौंपा जा रहा है, मैं सोच रहा हूं। उदाहरण के लिए:

List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;

स्थानीय रूप से त्रुटि को पुन: उत्पन्न करने में सक्षम होने के बिना त्रुटि के स्रोत का अनुमान लगाना मुश्किल है।

अगर किसी को भी इस त्रुटि के साथ कोई अनुभव हुआ है, तो मैं वास्तव में जानना चाहूंगा कि आपने क्या पाया।

जवाबों:


36

मैंने इस त्रुटि को अच्छे आकार के व्यूस्टेट के संयोजन और आक्रामक सामग्री-फ़िल्टरिंग उपकरणों / फायरवॉल (विशेषकर के -12 शैक्षणिक संस्थानों से निपटने के दौरान) के कारण देखा है।

हमने SQL सर्वर में Viewstate को संग्रहीत करके इसके चारों ओर काम किया। उस मार्ग पर जाने से पहले, मैं यह सलाह दूंगा कि अपने बड़े पैमाने पर उपयोग को सीमित करने की कोशिश करें, ताकि इसमें कुछ भी बड़ा न हो और सभी नियंत्रणों के लिए इसे बंद कर दिया जाए, जिसकी आवश्यकता नहीं है।

SQL सर्वर में ViewState के भंडारण के लिए संदर्भ:
MSDN - PageStatePersister
ASP एलायंस का अवलोकन - SQL सर्वर कोड प्रोजेक्ट में Viewstate को संग्रहीत करने की सरल विधि
- ViewState प्रदाता मॉडल


मैंने पृष्ठ के विवरण को कॉपी किया और उसे वर्ड में पेस्ट किया। यह 86000 से अधिक वर्ण लंबा था। जो बहुत ज्यादा लगता है।
स्लिम

Yikes, मैं अब समस्या में चल रहा हूँ। मैंने सभी नियंत्रणों के लिए ViewState को बंद कर दिया है जो मैं संभवतः कर सकता हूं। मैं कई पृष्ठों और बहुत सारी सामग्री के साथ एक विज़ार्ड नियंत्रण का उपयोग कर रहा हूं। कोई सलाह?
माइक कोल

@ मायके सी।, यह एक बहुत ही निराशाजनक समस्या है! आप विज़ार्ड के प्रत्येक पृष्ठ की सामग्री को उपयोगकर्ता नियंत्रण में तोड़ सकते हैं और मांग पर सामग्री लोड कर सकते हैं (ajax के माध्यम से?)। बेशक, यह उस एक पृष्ठ के लिए केवल एक समाधान है, यदि आप लगातार आधार पर समस्या का अनुभव करना शुरू करते हैं, तो आप अपने डेटाबेस में भंडारण के बारे में विचार करना चाह सकते हैं। मैंने SQL सर्वर में व्यूस्टेट को संग्रहीत करने के संदर्भ के साथ अपना उत्तर अपडेट किया है।
जिम्मी आर। Houts

1
एक और समस्या जो मैंने char६००० से अधिक लंबे चरों के साथ चलाई है (वास्तव में think५ के करीब हो सकती है, मुझे लगता है, सिंगल-बाइट चार्ट मानते हुए) यह है कि आपका .NET ऐप बड़े ऑब्जेक्ट के ढेर पर व्यूस्टेट स्ट्रिंग्स लगाना शुरू कर सकता है, जिससे ढेर हो सकता है समय पर विखंडन (और अंततः OutOfMemoryException) यदि ऐप पूल पुनर्नवीनीकरण नहीं किया गया है।
कुछ भी

मुझे एक ही मुद्दा मिला, इस मुद्दे को कैसे सुलझाया जाए कृपया इसे स्पष्ट करें।
साजित

84

UrlDecode पाठ को संसाधित करने के बाद, यह सभी '+' वर्णों को '' के साथ बदलता है ... इस प्रकार त्रुटि। आपको बस आधार 64 को फिर से संगत बनाने के लिए इस कथन को कॉल करना चाहिए:

        sEncryptedString = sEncryptedString.Replace(' ', '+');

उत्तम सामग्री। धन्यवाद। मैं C ++ MFC एप्लिकेशन से ASP.NET वेब सेवा को कॉल कर रहा था और इसे हल करने के लिए कई दिशाओं में शाखा लगा सकता था और पहले ही इस पर कुछ घंटे बिता चुका था। आपने मुझे समय का एक समूह बचा लिया है।
nspire

3
बस इस समस्या को हिट करें और जैसा कि आपने कहा कि यह रिक्त स्थान था, +इसे ठीक करने के स्थान पर। नायक!
mattytommo

क्या कोई इस कोड को शामिल करने के लिए मार्गदर्शन दे सकता है? मैं बार-बार इस मुद्दे से निपट रहा हूं, लेकिन कोड स्निपेट से, मैं यह निर्धारित नहीं कर सकता कि फिक्स को कैसे लागू किया जाए।
dst3p

@ dst3p जहाँ भी आप त्रुटि का सामना करते हैं प्रसंस्करण पाइपलाइन में इसका उपयोग करें। अपने स्टैक ट्रेस की जाँच करें और देखें कि कौन सी विधि त्रुटि का कारण बन रही है।
जलाल एल-शायर

21

मेरा अनुमान है कि कुछ या तो एन्कोडिंग है या बहुत बार डिकोडिंग है - या जिसमें आपको कई लाइनों के साथ टेक्स्ट मिला है।

बेस 64 स्ट्रिंग्स की लंबाई 4 अक्षरों की एक बहु होनी चाहिए - प्रत्येक 4 वर्ण इनपुट डेटा के 3 बाइट्स का प्रतिनिधित्व करते हैं। किसी तरह, ASP.NET द्वारा वापस देखे जा रहे राज्य डेटा को दूषित किया जाता है - लंबाई 4 से अधिक नहीं है।

क्या ऐसा होने पर आप उपयोगकर्ता एजेंट को लॉग इन करते हैं? मुझे आश्चर्य है कि क्या यह एक बुरी तरह से व्यवहार किया गया ब्राउज़र है ... एक और संभावना यह है कि एक प्रॉक्सी शरारती चीजें कर रही है। इसी तरह अनुरोध की सामग्री की लंबाई लॉग करने का प्रयास करें, ताकि आप देख सकें कि क्या यह केवल बड़े अनुरोधों के लिए होता है।


मेरे मामले में ब्राउज़र हमेशा सफारी है, या तो मोबाइल या डेस्कटॉप संस्करण
कॉकपअप

12

इसे इस्तेमाल करे:

public string EncodeBase64(string data)
{
    string s = data.Trim().Replace(" ", "+");
    if (s.Length % 4 > 0)
        s = s.PadRight(s.Length + 4 - s.Length % 4, '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(s));
}

इस विधि से समस्या को हल करने में मदद मिली। हालाँकि मैंने UTF8 एन्कोडिंग
अभिषेक श्रीवास्तव

10
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

जहां qsकोई भी बेस 64 एन्कोडेड स्ट्रिंग है


8

जैसा कि दूसरों ने उल्लेख किया है कि यह तब हो सकता है जब कुछ फायरवॉल और परदे के पीछे बड़ी संख्या में ViewState डेटा वाले पृष्ठों तक पहुंच को रोकते हैं।

ASP.NET 2.0 ने ViewState चंकिंग तंत्र की शुरुआत की, जो ViewState को प्रबंधनीय विखंडू में तोड़ता है, जिससे ViewState को समस्या के बिना प्रॉक्सी / फ़ायरवॉल से गुजरने की अनुमति मिलती है।

इस सुविधा को सक्षम करने के लिए बस अपनी web.config फ़ाइल में निम्न पंक्ति जोड़ें।

<pages maxPageStateFieldLength="4000">

यह आपके ViewState आकार को कम करने के लिए एक विकल्प के रूप में उपयोग नहीं किया जाना चाहिए, लेकिन यह आक्रामक परदे के पीछे और जैसी "त्रुटि के लिए एक आधार -64 चार सरणी के लिए अमान्य लंबाई" के खिलाफ एक प्रभावी बैकस्टॉप हो सकता है।


क्या इसका कोई दुष्प्रभाव हो सकता है?
मॉन्स्टरमोरपीजी

कोई भी जिसे मैंने कभी देखा है, व्यूस्टेट पर अधिक जानकारी
लाल ताज़

तो क्या आपका इष्टतम ऋणदाता है? मैंने इसे 1024 में सेट किया
मॉन्स्टरमॉरज

1

यह दुख की बात नहीं है। कुछ समय के लिए रुक-रुक कर होने वाली त्रुटि में भाग लेने के बाद और अंत में इसे ठीक करने की कोशिश करने के लिए पर्याप्त रूप से परेशान होने के बाद, मुझे अभी तक एक फिक्स ढूंढना है। हालांकि, मैंने अपनी समस्या को फिर से प्रस्तुत करने के लिए एक नुस्खा निर्धारित किया है, जो दूसरों की मदद कर सकता है।

मेरे मामले में यह मेरे देव मशीन पर भी एक स्थानीयहोस्टल समस्या है, जिसमें ऐप की डीबी भी है। यह एक .NET 2.0 ऐप है जिसका मैं VS2005 के साथ संपादन कर रहा हूं। Win7 64 बिट मशीन में VS2008 और .NET 3.5 भी है।

यहाँ विभिन्न प्रकार के त्रुटि उत्पन्न होंगे:

  1. फॉर्म की एक नई प्रति लोड करें।
  2. फॉर्म के किसी भी नियंत्रण के साथ कुछ डेटा, और / या पोस्टबैक दर्ज करें। जब तक कोई महत्वपूर्ण विलंब नहीं होता है, तब तक आप सभी को दोहराते हैं, और कोई त्रुटि नहीं होती है।
  3. थोड़ी देर प्रतीक्षा करें (1 या 2 मिनट शायद, 5 से अधिक नहीं), और एक और पोस्टबैक का प्रयास करें।

एक मिनट या दो देरी "लोकलहोस्ट की प्रतीक्षा" और फिर ब्राउज़र द्वारा "कनेक्शन रीसेट हो गया", और global.asaxएप्लिकेशन की त्रुटि ट्रैप लॉग्स:

Application_Error event: Invalid length for a Base-64 char array.
Stack Trace:
     at System.Convert.FromBase64String(String s)
     at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
     at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
     at System.Web.UI.HiddenFieldPageStatePersister.Load()

इस मामले में, यह व्यूस्टेट का आकार नहीं है, लेकिन पृष्ठ और / या व्यूस्टेट कैशिंग के साथ कुछ करना है जो मुझे काट रहा है। स्थापना <pages>मानकों enableEventValidation="false", और viewStateEncryption="Never"में Web.configव्यवहार नहीं बदला। न ही maxPageStateFieldLengthकुछ मामूली से सेटिंग की ।


1

अपने HttpHandlers पर एक नज़र डालें। मैं पिछले कुछ महीनों में कुछ अजीब और पूरी तरह से यादृच्छिक त्रुटियों को नोटिस कर रहा हूं जब मैंने एक संपीड़न उपकरण (Telerik से RadCompression) को लागू किया था। मैं इस तरह की त्रुटियों को देख रहा था:

  • System.Web.HttpException: डेटा को मान्य करने में असमर्थ।

  • System.Web.HttpException: क्लाइंट डिस्कनेक्ट हो गया ।---> System.Web.UI.ViewStateException: अमान्य व्यूस्टेट।

तथा

  • System.FormatException: बेस -64 चार सरणी के लिए अमान्य लंबाई।

  • System.Web.HttpException: क्लाइंट डिस्कनेक्ट हो गया। ---> System.Web.UI.ViewStateException: अमान्य व्यूस्टेट।

मैंने इस बारे में अपने ब्लॉग पर लिखा है


आपका ब्लॉग डाउन है। क्या आपके पास एक और लिंक है या आप संबंधित जानकारी पोस्ट कर सकते हैं? thx
mga911


0

यह एक विशाल दृश्य स्थिति के कारण है, मेरे मामले में मैं भाग्यशाली हो गया क्योंकि मैं व्यूस्टेट का उपयोग नहीं कर रहा था। मैंने सिर्फ enableviewstate="false"फॉर्म टैग और व्यू स्टेट पर जोड़ा है जो 35k से 100 वर्णों तक चला गया है


0

सदस्यता के लिए प्रारंभिक परीक्षण के दौरान। SqlMembershipProvider के साथ ValidateUser, मैं नमक के साथ संयुक्त हैश (SHA1) एल्गोरिथ्म का उपयोग करता हूं, और, अगर मैंने नमक की लंबाई को चार से विभाज्य नहीं होने वाली लंबाई में बदल दिया, तो मुझे यह त्रुटि मिली।

मैंने ऊपर दिए गए किसी भी सुधार की कोशिश नहीं की है, लेकिन अगर नमक को बदल दिया जा रहा है, तो इससे किसी को इस विशेष त्रुटि के स्रोत के रूप में इंगित करने में मदद मिल सकती है।


0

जैसा कि जॉन स्कीट ने कहा, स्ट्रिंग 4 बाइट्स से अधिक होनी चाहिए। लेकिन मुझे अभी भी त्रुटि हो रही थी।

कम से कम यह डिबग मोड में हटा दिया गया। Convert.FromBase64String()कोड के माध्यम से कदम पर एक ब्रेक प्वाइंट रखो । चमत्कारी रूप से, मेरे लिए त्रुटि गायब हो गई :) यह संभवतः व्यू स्टेट्स और इसी तरह के अन्य मुद्दों से संबंधित है जैसा कि अन्य ने रिपोर्ट किया है।


0

@ Jalchr के समाधान के अलावा जिसने मेरी मदद की, मैंने पाया कि जब ATL::Base64Encodeआप ASP.NET वेबसाइट पर जाने वाली सामग्री को एन्कोड करने के लिए c ++ एप्लिकेशन से कॉल करते हैं , तो आपको कुछ और चाहिए। के अतिरिक्त

sEncryptedString = sEncryptedString.Replace(' ', '+'); 

से @ jalchr के समाधान, आप भी सुनिश्चित करना है कि आप की जरूरत का उपयोग नहीं करतेATL_BASE64_FLAG_NOPAD पर झंडा ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.