Bu "Base-64 karakter dizisi için geçersiz uzunluk" a neden olan şey


91

Burada devam edecek çok az şeyim var. Bunu yerel olarak yeniden oluşturamıyorum, ancak kullanıcılar hatayı aldıklarında otomatik bir e-posta istisna bildirimi alıyorum:

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

Görünüm durumuna atanan verilerle ilgili bir sorun olduğunu düşünme eğilimindeyim. Örneğin:

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

Hatayı yerel olarak yeniden üretmeden hatanın kaynağını tahmin etmek zordur.

Herhangi birinin bu hatayla ilgili herhangi bir deneyimi varsa, ne bulduğunuzu gerçekten bilmek isterim.

Yanıtlar:


36

Bu hatayı, iyi boyutlu görünüm durumu ve aşırı agresif içerik filtreleme cihazları / güvenlik duvarlarının (özellikle K-12 Eğitim kurumları ile uğraşırken) kombinasyonunun neden olduğunu gördüm.

Viewstate'i SQL Server'da depolayarak bunun üstesinden geldik. Bu rotaya gitmeden önce, içinde büyük bir şey saklamayarak ve ihtiyaç duymayan tüm kontroller için kapatarak viewstate kullanımınızı sınırlandırmaya çalışmanızı tavsiye ederim.

ViewState'i SQL Server'da depolamak için referanslar:
MSDN - PageStatePersister
ASP Alliance'a Genel Bakış - Görünüm durumunu SQL Server Code Project'te depolamak için basit yöntem
- ViewState Sağlayıcı Modeli


Sayfanın görünümünü kopyaladım ve Word'e yapıştırdım. 86000 karakterin üzerindeydi. Bu çok fazla görünüyor.
Slim

Yikes, şimdi sorunla karşılaşıyorum. Yapabileceğim tüm kontroller için ViewState'i kapattım. Birkaç sayfalı ve çok sayıda içeriğe sahip bir Sihirbaz denetimi kullanıyorum. Herhangi bir tavsiye?
Mike Cole

@Mike C., bu çok sinir bozucu bir sorun! Sihirbazın her sayfasının içeriğini kullanıcı kontrollerine bölebilir ve içeriği isteğe bağlı olarak yükleyebilirsiniz (ajax aracılığıyla?). Elbette, bu sadece o sayfa için bir çözümdür, sorunu tutarlı bir şekilde yaşamaya başlarsanız, veritabanınızda görünüm durumunu depolamayı düşünebilirsiniz. Yanıtımı, görünüm durumunu SQL Server'da depolamak için referanslarla güncelledim.
Jimmie R. Houts

1
86000'den fazla karakter uzunluğunda karşılaştığım bir diğer sorun (aslında 85K'ya yakın olabilir, sanırım, tek baytlık karakterleri varsayarsak), .NET uygulamanız da büyük nesne yığınına görüntü durumu dizeleri koymaya başlayabilir ve bu da yığın oluşturabilir Uygulama havuzu geri dönüştürülmezse zaman içinde parçalanma (ve sonunda OutOfMemoryException).
noneisnecessary

Aynı sorunu yaşıyorum, bu sorunu nasıl çözeceğimi lütfen açıklığa kavuşturun.
Sajith

84

UrlDecode metni işledikten sonra, tüm '+' karakterleri '' ile değiştirir ... ve dolayısıyla hata. Temel 64 uyumlu hale getirmek için bu ifadeyi basitçe çağırmalısınız:

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

Harika şeyler. Teşekkürler. Bir C ++ MFC uygulamasından bir ASP.NET web hizmetini çağırıyordum ve bunu çözmeye çalışırken ve üzerinde birkaç saat geçirdikten sonra birçok yönden ayrılabilirdim. Az önce bana çok zaman kazandırdın.
nspire

3
Sadece bu problemi çöz ve dediğin gibi boşluklar, düzelt ile değiştir +. Kahraman!
mattytommo

Bu kodun nereye ekleneceği konusunda kimse rehberlik edebilir mi? Bu sorunu sık sık ele alıyorum, ancak kod parçacığından düzeltmeyi nereye uygulayacağımı belirleyemiyorum.
dst3p

@ dst3p Bunu, işleme hattında hatayla karşılaştığınız her yerde kullanın. Yığın izlemenizi kontrol edin ve hangi yöntemin hataya neden olduğunu görün.
Jalal El-Shaer

21

Tahminimce bir şey ya çok sık kodlanıyor ya da kod çözülüyor - ya da içinde birden çok satır bulunan bir metin var.

Base64 dizeleri 4 karakter uzunluğunda olmalıdır - her 4 karakter 3 bayt giriş verisini temsil eder. Her nasılsa, ASP.NET tarafından geri aktarılan görünüm durumu verileri bozuktur - uzunluk 4'ün katı değildir.

Bu meydana geldiğinde kullanıcı aracısını kaydediyor musunuz? Acaba bir yerlerde kötü davranan bir tarayıcı mı ... başka bir olasılık da yaramaz şeyler yapan bir vekil olması. Aynı şekilde, isteğin içerik uzunluğunu günlüğe kaydetmeye çalışın, böylece bunun yalnızca büyük istekler için olup olmadığını görebilirsiniz.


Benim durumumda tarayıcılar her zaman Safari, mobil veya masaüstü sürümü
cockypup

12

Bunu dene:

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

Bu yöntem sorunun çözülmesine yardımcı oldu. UTF8 kodlamasını kullanmama rağmen
Abhishek Shrivastava

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

qsbase64 kodlu dizeler nerede


8

Diğerlerinin de belirttiği gibi, bu, bazı güvenlik duvarları ve proxy'lerin büyük miktarda ViewState verisi içeren sayfalara erişimi engellediğinde ortaya çıkabilir.

ASP.NET 2.0, ViewState Chunking mekanizmasını tanıttı yönetilebilir parçalara proxy / güvenlik duvarından sorunsuz geçmesine izin verdi.

Bu özelliği etkinleştirmek için aşağıdaki satırı web.config dosyanıza eklemeniz yeterlidir.

<pages maxPageStateFieldLength="4000">

Bu gereken değil viewstate boyutunu azaltmak için bir alternatif olarak kullanılabilir ama agresif vekiller ve benzerinden elde edilen hata "Bir baz-64 karakter dizisi için geçersiz uzunluğu" karşı etkili bir arka durdurma olabilir.


bunun herhangi bir yan etkisi olabilir mi?
MonsterMMORPG

Şimdiye kadar gözlemlediğim hiçbir şey , görünüm durumu hakkında daha fazla bilgi
Red Taz

peki en uygun uzunluğunuz nedir? 1024
MonsterMMORPG

1

Maalesef bu bir cevap değil. Bir süre aralıklı bir hatayla karşılaştıktan ve sonunda onu düzeltmeye çalışacak kadar sinirlendikten sonra, henüz bir düzeltme bulamadım. Bununla birlikte, sorunumu yeniden üretmek için başkalarına yardımcı olabilecek bir reçete belirledim.

Benim durumumda, uygulamanın DB'sine sahip olan dev makinemde YALNIZCA bir localhost sorunu. VS2005 ile düzenlediğim bir .NET 2.0 uygulaması. Win7 64 bit makinede ayrıca VS2008 ve .NET 3.5 yüklüdür.

Aşağıda, çeşitli biçimlerde hatayı oluşturan şey açıklanmaktadır:

  1. Formun yeni bir kopyasını yükleyin.
  2. Bazı verileri girin ve / veya formun herhangi bir kontrolüyle geri gönderin. Önemli bir gecikme olmadığı sürece, istediğiniz her şeyi tekrarlayın ve hiçbir hata oluşmaz.
  3. Biraz bekleyin (belki 1 veya 2 dakika, en fazla 5 dakika) ve başka bir geri gönderme yapmayı deneyin.

Bir veya iki dakika gecikme "localhost bekleniyor" ve ardından tarayıcı tarafından "Bağlantı sıfırlandı" ve global.asaxuygulamanın hata tuzağı günlükleri:

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

Bu durumda, görünüm durumunun BOYUTU değil, beni ısırıyor görünen sayfa ve / veya görünüm önbelleğe alma ile ilgili bir şey. <pages>Parametreleri ayarlama enableEventValidation="false"ve viewStateEncryption="Never"içinde Web.configdavranışı değiştirmedi. maxPageStateFieldLengthMütevazı bir şeye ayarlamak da yapmadı .


1

HttpHandlers'ınıza bir göz atın. Bir sıkıştırma aracı (Telerik'ten RadCompression) uyguladıktan sonra son birkaç aydır bazı tuhaf ve tamamen rastgele hatalar fark ettim. Şunun gibi hataları fark ettim:

  • System.Web.HttpException: Veriler doğrulanamıyor.

  • System.Web.HttpException: İstemci bağlantısı kesildi .--> System.Web.UI.ViewStateException: Geçersiz görünüm durumu.

ve

  • System.FormatException: Base-64 karakter dizisi için geçersiz uzunluk.

  • System.Web.HttpException: İstemci bağlantısı kesildi. ---> System.Web.UI.ViewStateException: Geçersiz görünüm durumu.

Bunu blogumda yazdım .


Blogunuz kapalı. Başka bir bağlantınız var mı veya ilgili bilgileri gönderebilir misiniz? thx
mga911


0

Bunun nedeni büyük bir görünüm durumudur, Benim durumumda, görünüm durumunu kullanmadığım için şanslıydım. enableviewstate="false"Form etiketine yeni ekledim ve görünüm durumu 35k'den 100 karaktere çıktı


0

SqlMembershipProvider ile Membership.ValidateUser için ilk test sırasında, bir salt ile birleştirilmiş karma (SHA1) algoritması kullanıyorum ve tuz uzunluğunu dörde bölünemeyen bir uzunluğa değiştirirsem, bu hatayı aldım.

Yukarıdaki düzeltmelerden hiçbirini denemedim, ancak tuz değiştiriliyorsa, bu, birisinin bunu bu belirli hatanın kaynağı olarak belirlemesine yardımcı olabilir.


0

Jon Skeet'in dediği gibi, dize 4 baytın katı olmalıdır. Ama yine de hatayı alıyordum.

En azından hata ayıklama modunda kaldırıldı. Bir kırılma noktası koyun ve Convert.FromBase64String()ardından kodda ilerleyin. Mucizevi bir şekilde, hata benim için ortadan kalktı :) Muhtemelen Görünüm durumları ve diğerlerinin bildirdiği benzer diğer sorunlarla ilgilidir.


0

@ Jalchr'ın bana yardımcı olan çözümüne ek olarak , bir ASP.NET web hizmetine ilettiğinizATL::Base64Encode içeriği kodlamak için bir c ++ uygulamasından arama yaparken , başka bir şeye de ihtiyacınız olduğunu gördüm . Ek olarak

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

dan @ jalchr solüsyonu, sen de bunu sağlamak için gereken kullanmayınATL_BASE64_FLAG_NOPAD üzerinde bayrak ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.