Saya hanya punya sedikit hal untuk dilanjutkan di sini. Saya tidak dapat mereproduksi ini secara lokal, tetapi ketika pengguna mendapatkan kesalahan saya mendapatkan pemberitahuan pengecualian email otomatis:
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()
Saya cenderung berpikir ada masalah dengan data yang ditugaskan ke kondisi tampilan. Sebagai contoh:
List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
Sulit untuk menebak sumber kesalahan tanpa bisa mereproduksi kesalahan secara lokal.
Jika ada yang pernah mengalami kesalahan ini, saya sangat ingin tahu apa yang Anda temukan.
Setelah urlDecode memproses teks, itu menggantikan semua '+' karakter dengan '' ... jadi kesalahan. Anda cukup memanggil pernyataan ini agar basis 64 kompatibel lagi:
sEncryptedString = sEncryptedString.Replace(' ', '+');
sumber
+
memperbaikinya. Pahlawan!Dugaan saya adalah ada sesuatu yang terlalu sering encoding atau decoding - atau Anda memiliki teks dengan banyak baris.
String Base64 harus kelipatan 4 karakter - setiap 4 karakter mewakili 3 byte data input. Entah bagaimana, data status tampilan yang dikirimkan kembali oleh ASP.NET rusak - panjangnya bukan kelipatan 4.
Apakah Anda memasukkan agen pengguna saat ini terjadi? Saya bertanya-tanya apakah itu browser yang berperilaku buruk di suatu tempat ... kemungkinan lain adalah ada proxy yang melakukan hal-hal nakal. Coba juga untuk mencatat panjang konten permintaan, sehingga Anda dapat melihat apakah itu hanya terjadi untuk permintaan besar.
sumber
Coba ini:
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)); }
sumber
int len = qs.Length % 4; if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');
di mana
qs
ada string yang dikodekan base64sumber
Seperti yang telah disebutkan orang lain, ini dapat terjadi jika beberapa firewall dan proxy mencegah akses ke halaman yang berisi data ViewState dalam jumlah besar.
ASP.NET 2.0 memperkenalkan mekanisme Pemotongan Kondisi Tampilan yang memecah Kondisi Tampilan menjadi bagian yang dapat dikelola, memungkinkan Kondisi Tampilan melewati proxy / firewall tanpa masalah.
Untuk mengaktifkan fitur ini cukup tambahkan baris berikut ke file web.config Anda.
<pages maxPageStateFieldLength="4000">
Ini tidak boleh digunakan sebagai alternatif untuk mengurangi ukuran Kondisi Tampilan Anda, tetapi ini bisa menjadi penghenti yang efektif terhadap kesalahan "Panjang tidak valid untuk array karakter Base-64" yang dihasilkan dari proxy agresif dan sejenisnya.
sumber
Sayangnya, ini bukanlah jawaban. Setelah mengalami kesalahan intermiten selama beberapa waktu dan akhirnya cukup kesal untuk mencoba memperbaikinya, saya belum menemukan perbaikan. Namun, saya telah menentukan resep untuk mereproduksi masalah saya, yang mungkin dapat membantu orang lain.
Dalam kasus saya, ini HANYA masalah localhost, di mesin dev saya yang juga memiliki DB aplikasi. Ini adalah aplikasi .NET 2.0 yang saya edit dengan VS2005. Mesin Win7 64 bit juga memiliki VS2008 dan .NET 3.5 diinstal.
Inilah yang akan menghasilkan kesalahan, dari berbagai bentuk:
Satu atau dua menit penundaan "menunggu localhost" dan kemudian "Sambungan disetel ulang" oleh browser, dan
global.asax
log perangkap kesalahan aplikasi:Dalam kasus ini, bukan SIZE dari kondisi tampilan, tetapi ada hubungannya dengan cache halaman dan / atau kondisi tampilan yang tampaknya mengganggu saya. Pengaturan
<pages>
parameterenableEventValidation="false"
, danviewStateEncryption="Never"
dalamWeb.config
tidak mengubah perilaku. Juga tidak mengaturmaxPageStateFieldLength
ke sesuatu yang sederhana.sumber
Lihatlah HttpHandlers Anda. Saya telah memperhatikan beberapa kesalahan aneh dan acak sepenuhnya selama beberapa bulan terakhir setelah saya menerapkan alat kompresi (RadCompression dari Telerik). Saya melihat kesalahan seperti:
System.Web.HttpException: Tidak dapat memvalidasi data.
System.Web.HttpException: Klien terputus .---> System.Web.UI.ViewStateException: Kondisi tampilan tidak valid.
dan
System.FormatException: Panjang tidak valid untuk array karakter Base-64.
System.Web.HttpException: Klien terputus. ---> System.Web.UI.ViewStateException: Kondisi tampilan tidak valid.
Saya menulis tentang ini di blog saya.
sumber
Ini karena status tampilan yang sangat besar, Dalam kasus saya, saya beruntung karena saya tidak menggunakan kondisi tampilan. Saya baru saja menambahkan
enableviewstate="false"
pada tag formulir dan status tampilan berubah dari 35k menjadi 100 karaktersumber
Selama pengujian awal untuk Membership.ValidateUser dengan SqlMembershipProvider, saya menggunakan algoritme hash (SHA1) yang digabungkan dengan salt, dan, jika saya mengubah panjang salt menjadi panjang yang tidak habis dibagi empat, saya menerima error ini.
Saya belum mencoba salah satu perbaikan di atas, tetapi jika garam diubah, ini dapat membantu seseorang menunjukkan itu sebagai sumber kesalahan khusus ini.
sumber
Seperti yang dikatakan Jon Skeet, string harus kelipatan 4 byte. Tapi saya masih mendapatkan kesalahannya.
Setidaknya itu dihapus dalam mode debug. Letakkan titik istirahat
Convert.FromBase64String()
lalu lewati kode. Ajaibnya, kesalahan tersebut menghilang untuk saya :) Ini mungkin terkait dengan status View dan masalah serupa lainnya seperti yang dilaporkan orang lain.sumber
Selain solusi @ jalchr yang membantu saya, saya menemukan bahwa saat memanggil
ATL::Base64Encode
dari aplikasi c ++ untuk menyandikan konten yang Anda berikan ke layanan web ASP.NET, Anda juga memerlukan sesuatu yang lain. Sebagai tambahannyasEncryptedString = sEncryptedString.Replace(' ', '+');
dari solusi @ jalchr, Anda juga perlu memastikan bahwa Anda tidak menggunakan
ATL_BASE64_FLAG_NOPAD
flag padaATL::Base64Encode
:BOOL bEncoded = Base64Encode(lpBuffer, nBufferSizeInBytes, strBase64Encoded.GetBufferSetLength(base64Length), &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
sumber