PDA

View Full Version : سوال: درباره CallContext



vzsoft
سه شنبه 18 اسفند 1388, 17:03 عصر
سلام

میخواستم بدونم کد زیر چه کاری انجام میده



object data = CallContext.GetData("contextName");


و با کد زیر فرق میکنه



object data = HttpContext.Current.Items["contextName"];


با تشکر

Chabok
سه شنبه 18 اسفند 1388, 19:09 عصر
با سلام

کلاس CallContext در فضای نام System.Runtime.Remoting.Messaging (http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.aspx) قرار داره که مربوط به Remoting و تبادل پیام است .

ولی HttpContext.Current.Items (http://aspnet.4guysfromrolla.com/articles/060904-1.aspx) در مورد HttpContext است که مربوط به ASP.NET و HttpRequest می باشد .

شاید Context هر دو مورد باعث سوال شما شده است .
ولی در واقع هر کدام مربوط به کلاسی جدا هستند و ربطی به هم ندارند .

mehdi.mousavi
سه شنبه 18 اسفند 1388, 19:27 عصر
سلام میخواستم بدونم کد زیر چه کاری انجام میده



object data = CallContext.GetData("contextName");
و با کد زیر فرق میکنه


object data = HttpContext.Current.Items["contextName"];


اوه! این دو تا با هم خیلی فرق دارن، اگر چه در وهله اول توی برنامه های ASP.NET بنظر کارکرد یکسانی دارن. اگر قراره که Object ای رو در طول بازه "Request-Response" نگهداری کنید و از اون استفاده کنید، باید از HttpContext.Current.Items استفاده کنید. این کالکشن، thread-safe هست و مشکلی براتون ایجاد نخواهد کرد.

اما اونیکی چیه، برای دونستن این مطلب، باید بدونید thread-agility چیه، ASP.NET Worker Process چطور کار میکنه و ... برای شروع می تونید این دو نوشته رو بخونید:


ThreadStatic, CallContext and HttpContext in ASP.NET (http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html)
CallContext vs. ThreadStatic vs. HttpContext (http://forum.springframework.net/showthread.php?t=572)

بطور خلاصه، اگه شما Object ای رو در CallContext نگهداری کنید، ممکنه (تکرار میکنم، ممکنه) بین BeginRequest و Page_Load، دات نت Thread فعلی شما رو متوقف کنه، Stack رو به جایی در حافظه Serialize کنه، Stack جدیدی بسازه و اونو به Thread مزبور Assign کنه و دستور ادامه فعالیت Thread رو صادر کنه. تو چنین حالتهایی، CallContext شما از بین رفته و دیگه نمیتونید (و نباید) روش حساب کنید.

اما وقتی چنین اتفاقی میفته، خود .NET مراقب HttpContext هستش و اونو خودش برای Thread جدید Marshal میکنه و میتونید براحتی از اون استفاده کنید. بنابراین توصیه میکنم، بطور کلی، استفاده از CallContext رو در ASP.NET بدست فراموشی بسپرید، چون مشکلاتی که میتونه ایجاد کنه، بیشتر از مسائلی هستش که بتونه حل کنه.

موفق باشید.