2 ضمیمه
مشکل MSCaptcha در UserControl با فشرده سازی ViewState
با سلام خدمت دوستان عزیز!
من از کنترل MSCaptcha به عنوان تصویر امنیتی استفاده می کنم. و البته ViewState صفحات رو هم فشرده می کنم (خیلی حال میده! توصیه می کنم حتما این کار رو بکنید).
تا حالا مشکلی نیست. این هم کد Captcha:
<%@ Register Assembly="MSCaptcha" Namespace="MSCaptcha" TagPrefix="SecImage" %>
<SecImage:CaptchaControl ID="CC1" runat="server" NoiseColor="MediumBlue" ForeColor="#3366FF"
CaptchaHeight="40" CaptchaWidth="150" Font-Size="5px" ValidationGroup="A" CaptchaBackgroundNoise="Extreme"
CaptchaLineNoise="High" FontColor="CornflowerBlue" LineColor="Cornsilk" />
این هم به web.config اضافه شده:
<httpHandlers>
<add path="CaptchaImage.axd" verb="GET" type="MSCaptcha.CaptchaImageHandler, MSCaptcha" />
</httpHandlers>
وقتی MSCaptcha رو توی یک UserControl میزارم و UserControl رو توی صفحه، وقتی میخوام Captcha رو Validate کنم با خطایی مبنی بر این که Key مقدارش نباید null باشه مواجه میشم. (عکس در ضمایم موجود است). وقتی دیگه ViewState رو فشرده نمی کنم، مشکل حل میشه. (خارج UserControl ها در هردو حالت هیچ مشکلی نیست)
Validate:
CC1.ValidateCaptcha(TBCC.Text);
if (!CC1.UserValidated)
{
Utility.ShowReport(Page, "کد امنیتی اشتباه است", MessageType.Error);
return;
}
به نظر میاد MSCaptcha یه چیزی توی ViewState ذخیره میکنه و وقتی من Validation رو انجام میدم، هنوز ViewState بازیابی نشده، پس خطا میده.
دوستان بزرگوار، لطف کنن بگن چرا این اتفاق می افته؟
نمی تونم بیخیال استفاده از MSCaptch توی UserControl بشم. لطفا راه کار بدید.
با تشکر!
ضمایم:
1. عکس پیغام خطا.
2. MSCaptcha.dll (متاسفانه سورسش رو ندارم)
نقل قول: مشکل MSCaptcha در UserControl با فشرده سازی ViewState
من SavePageStateToPersistenceMedium و LoadPageStateFromPersistenceMedium رو برای Compressing و DeCompressing ویو استست override می کنم.
آیا متد دیگه ای هست که به جای LoadPageStateFromPersistenceMedium استفاده کنم، به طوری که قبل از این که Captcha بخواد کاری بکنه، ViewState رو بازیابی کنه؟
لطفا کمک کنید!
private ObjectStateFormatter _formatter = new ObjectStateFormatter();
protected override void SavePageStateToPersistenceMedium(object viewState)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
_formatter.Serialize(ms, viewState);
byte[] viewStateArray = ms.ToArray();
ClientScript.RegisterHiddenField("__COMPRESSEDVIEW STATE", Convert.ToBase64String(CompressViewState.Compress( viewStateArray)));
}
protected override object LoadPageStateFromPersistenceMedium()
{
string vsString = Request.Form["__COMPRESSEDVIEWSTATE"];
byte[] bytes = Convert.FromBase64String(vsString);
bytes = CompressViewState.Decompress(bytes);
return _formatter.Deserialize(Convert.ToBase64String(byte s));
}
نقل قول: مشکل MSCaptcha در UserControl با فشرده سازی ViewState
به نظرتون مشکل از این Handler نیست؟
<httpHandlers>
<add path="CaptchaImage.axd" verb="GET" type="MSCaptcha.CaptchaImageHandler, MSCaptcha" />
</httpHandlers>
اساتید بزرگ، نظری ندارن؟
اگه راه حل راه حل اینه که بی خیال MSCaptcha بشم و برم سراغ یه Captcha دیگه، اشکال نداره! ولی خواهش می کنم منو تنها نزارید! :گریه: