مفهوم State Management در ASP.NET

سه شنبه 28 مهر 1394

در این مقاله مفهوم State Management را در ASP.NET توضیح می دهیم. State Management یک کنترل حفظ وضعیت در برنامه می باشد، زیرا که برنامه های ASP.NET وضعیت یا State را حفظ نمی کنند.

مفهوم State Management  در ASP.NET

State managment در ASP.NET بسیار مهم و مفید است، بطوریکه در بسیاری از مصاحبه ها این مورد چه از تازه کاران و چه از برنامه نویسان با تجربه پرسیده می شود.

State management یک کنترل حفظ وضعیت و شی(Object) در برنامه است زیرا برنامه های ASP.NET وضعیت فعلی خود را حفظ نمی کنند. یک نمونه(Instance) جدید از کلاس Web page هر بار یک صفحه ایجاد می کند که به سرور پست می شود. اگر کاربر اطلاعات را در یک برنامه وب وارد کند، این اطلاعات با چرخیدن توسط مرورگر در اینترنت از دست می روند.

در یک جمله می توان گفت، State management اطلاعات هر کاربر را تا زمان اتمام session کاربر نگهداشته و حفظ می کند.

دو نوع تکنیک State Management در دسترس است. که در شکل زیر نشان داده شده است:

Server Side_سمت سرور

Session.1

Session یک تکنیک بسیار مهم برای حفظ وضعیت یا state می باشد. Session به طور معمول برای ذخیره سازی اطلاعات و شناسایی(identity) استفاده می شود. برای ذخیره سازی سمت سرور از Sessionid استفاده می کند.

تنظیم Session کاربر:

protected void btnSubmit_Click(object sender, EventArgs e)  
{  
   Session["UserName"] = txtName.Text;  
  
   Response.Redirect("Home.aspx");  
}

 

رویداد Session :

رویداد Session را می توان در پروژه و در فایل Global.asax مشاهده کرد.

دو نوع رویداد Session وجود دارد که به صورت زیر است:

Session_Start.1

در رویداد Session_Start هر بار که یک کاربر جدید بدون session ID درخواست می دهد، بالا می آید.

void Session_Start(object sender, EventArgs e)  
{  
   Session["master"] = "~/Master.master";  
}

 

Session_End.2

رویداد Session_End زمانی بالا می آید که Session توسط یک کاربر به اتمام برسد و یا زمان خروج از  Session با استفاده از متد Session end سر رسیده باشد.

void Session_End(object sender, EventArgs e)  
{  
   Response.Write("Session_End");  
}

این Session با روش های زیر در ASP.NET ذخیره می شود:

InProcMode:

این یک حالت session پیش فرض است و مقدار ذخیره شده در حافظه وب سرور (IIS) می باشد. در این session مقدار با server start ذخیره شده و زمانی که سرور restart شود تمام می شود.

حالت  State Server:

در این حالت داده session در سرور مجزا ذخیره می شود.

حالت SQL Server:

این session در پایگاه داده ذخیره می شود و یک حالت امنیتی است.

حالت سفارشی یا دستی:

به طور کلی داده session در InProc، Sql Server، State server و غیره ذخیره می شود. اگر داده session را با دیگر تکنیک های جدید ذخیره کنید، آنگاه ASP.NET آن را فراهم می کند.

Application

Application State یک management stat سمت سرور می باشد. همچنین مدیریت وضعیت در سطح application نامیده می شود. در این ذخیره سازی به طور کلی فعالیت کاربران در حافظه سرور ذخیره می شود و رویداد application در فایل Global.asax نشان داده می شود.

سه نوع application در ASP.NET وجود دارد:

   Application_Start:

این رویداد با domain start شروع می شود.

Void Application_Start(object sender, EventArgs e)  
{  
   Application["AppstartMessage"] = "Welcome to CSharp Corner Developer Communtiy";  
}

Application_Error:

در این بخش خطاهای استثنای کنترل نشده مدیریت می شوند.

void Application_Error(object sender, EventArgs e)   
{   
   // Write an unhandled error code exception  
}

Application_ End:

این با دامنه و یا restart شدن IIS تمام می شود.

Void Application_End(object sender, EventArgs e)  
{  
   Application["AppEndMessage"] = "Application Closed";  
} 

 

Cache

Cache سمت سرور دخیره می شود. این مورد Page Caching و data caching را پیاده سازی می کند. Cache برای تنظیم سیاست های expiration استفاده می شود.


Response.Cache.SetExpiresTime(DateTime.Now.AddDays(1));

سمت کلاینت

حالا در اینجا state management را سمت کلاینت توضیح می دهیم:

state management چهار بخش مهم زیر را در سمت کلاینت دارد:

Cookie

Cookie یک بخش کوچک و مهم از ASP.NET است که در آن اطلاعات کاربران، session و application ذخیره می شود.

Cookieمی تواند به صورت ثابت و موقت ایجاد شده و با درخواست های مرورگر کار کند. Cookie ها سمت کلاینت ذخیره می شوند. سرور می تواند Cookie ها و داده های انتزاعی را بخواند. دو نوع cookie در دسترس است که در بخش زیر توضیح داده شده اند:

Persistence

این نوع cookie با داده و زمان کار می کند.

Response.Cookies["CookieName"].Value = "Test Cookies";  
//set expire time   
Response.Cookies["CookieName"].Expires = DateTime.Today.AddHours(1);

Non-Persistence

این یک cookie موقت است که با دسترسی به application و باطل شدن application بسته شده، ایجاد می شود.

Response.Cookies["CookieName"].Value = "Test Cookies"; 

 

Control state

Control state تکنیکی است که برای حفظ کار درست داده ها گسترش داده شده است.

ما می توانیم از view state استفاده کنیم اما فرض می کنیم که view state توسط کاربر غیر فعال شده است و این کنترل آنطور که انتظار داریم کار نمی کند.برای گرفتن نتایج مورد انتظار از این کنترل باید از Control State استفاده کنیم.در application، به صور پیش فرض Viewstate، مقدار Trueدارد.

برخی اوقات نیاز داریم از کنترل های سفارشی برای مدیریت درست application، استفاده کنیم.

if (!IsPostBack)  
{  
   lblmsg1.Text = "Welcome to C# corner";  
   lblmsg2.Text = "Welcome to C# corner community";  
}

 

زمانی که دو پیغام بر روی یک رویداد Postback نشان داده می شود آنگاه  کنترلی که با استفاده از control state سفارشی شده نشان داده می شود.

Hidden Field

Hidden Field ها برای ذخیره سازی سمت کلاینت استفاده می شوند. Hidden Field بر روی مرورگر نشان داده نمی شود اما بر روی یک درخواست کار می کند:

if (HiddenField1.Value != null)  
{  
   int val = Convert.ToInt32(HiddenField1.Value) + 1;  
   HiddenField1.Value = val.ToString();  
   Label1.Text = val.ToString();  
} 

 

Viewstate

Viewstate یک property سمت کلاینت بسیار مفید می باشد. این ویژگی برای page level state management استفاده شده است. Viewstate هرنوع داده را ذخیره می کند و برای ارسال و دریافت اطلاعات استفاده می شود.

مثال 1:Count

    ViewState Demo Count: <asp:Label runat="server" id="lblcount" />  
      
    <asp:Button runat="server" id="Submit" onclick="Submit_Click" text="show" />   
      
    protected void Page_Load(object sender, EventArgs e)  
    {  
        if (IsPostBack)  
        {  
            if (ViewState["count"] != null)  
            {  
                int ViewstateVal = Convert.ToInt32(ViewState["count"]) + 1;  
                lblcount.Text = ViewstateVal.ToString();  
                ViewState["count"] = ViewstateVal.ToString();  
            }  
            else  
            {  
                ViewState["count"] = "1";  
            }  
        }  
    }  
    protected void Submit_Click(object sender, EventArgs e)  
    {  
        lblcount.Text = ViewState["count"].ToString();  

 

مثال 2:Set/Get کاربر

if (ViewState["UserName"] != null)  
lblName.Text = ViewState["UserName"].ToString();

یا

ViewState["UserName"] = txtUserName.Text;

 

به کارگیری Viewstate بسیار آسان است و نیازی به هیچ نوع منبعی از سرور ندارد. در Viewstate داده های بزرگ(big data) را ذخیره نمی کنیم و فقط مقادیر کوچک ذخیره می شوند. Viewstate بر روی  page level control فعال و غیر فعال می شوند. همچنین از Encryption(رمزنگاری) و Decryption (رمزگشایی) پشتیبانی می کند و داده/مقدار با فرمت hashe شده ذخیره می شوند. بنابراین داده های مهم مانند کلمه عبور، اطلاعات کاربری و غیره را ذخیره نمی کنیم. زمانی که داده ها بیشتری روی آن ذخیره شوند، صفحه سنگین می شود.

 

Query String

Query String مقدار را در URL ذخیره می کند.

Response.Redirect("ShowStringValue.aspx?Username=" + txtUsername.Text);

 

این مورد برای تمام کاربران در url  به صورت لینک زیر قابل مشاهده است:

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید