نوشته شده توسط
MH2538
سلام
ممنون از راهنماییتون ولی مشکل توی ارسال اطلاعات به روشی که trasnparency «داشته باشه نیست مشکل من اینه :
فرض کنید دفعه اول که کاربر می خواد یه تابع رو اجرا کنه من با یک تابع سمت وب سرویس و دریافت نام کاربر و رمز عبور ، کاربر رو اعتبارسنجی کنم و بعد تابع مورد نظر کاربر رو اجرا کنم.
مشکل اینجاست که بعد از پایان تابع نتایج این اعتبار سنجی از بین می ره .
تو وب من این نتایج رو تو session نگه می داشتم ولی اینجا عمر session حداکثر در سطح تابع است.
از جانب دیگه ، من این برنامه رو دارم برای embedded OS می نویسم بنابراین بدلایل خاصی دسترسی به کوکی هم ندارم.
ضمن اینکه پیچیدگی های نصب و داشتن امکان نصب هم همونطور که DelphiAssistant گفت خودش از مسایلی که وجود داره
با تشکر
سلام.
این حرفتون درست نیست که "عمر Session حداکثر در سطح یک تابع است". اگر یه خورده به این حرف فکر کنید، می بینید که اگه Session ها lifetime اشون در سطح تابع باشه، اونوقت با یه local variable فرقی نمی کنن! پس اینطور نیست!
برای اینکه یک یا چند تابع در وب سرویس رو بتونید در یک Session بکار ببرید، باید وب متودهای مورد نظرتون رو با Attribute ای به اسم EnableSession، دکوریت کنید. مثلا:
[ WebMethod(EnableSession=true) ]
public void DoWhatever()
به این ترتیب به ASP.NET دارید یه hint میدید که بدونه متود DoWhateverُ در یک وضعیت Session-full قراره استفاده بشه. کلیه متودهای دیگه مورد نظرتون رو هم که قراره به Session دسترسی داشته باشن، باید با همین روش decorate کنید. اما این فقط بخشی از کاره.
بخش دیگه سمت Client باید انجام بشه. به این ترتیب که باید به Proxy ی تولید شده توسط VS، یک instance از کلاس CookieContainer بدید:
System.Net.CookieContainer cc = new System.Net.CookieContainer();
proxyInstance.CookieContainer = cc;
ممکنه همه این کار ها رو انجام بدید و متوجه بشید که هنوز Session ها در دسترس نیستن (سمت سرور!). اشتباهی که معمولا افراد می کنن این هستش که instance های متفاوت از Proxy اولید می کنن و انتطار دارن که Session تولید شده در یک وب متود، در وب متود دیگه ای در دسترس باشه. بله، البته که اینطور نیست!
شما باید مطمئن بشید که در طول اجرای برنامه فقط یک instance از کلاس Proxy تولید می کنید و ... در غیر اینصورت باید کارهای دیگه ای انجام بدید که از حوصله این بحث خارجه. یادتون باشه که CookieContainer همونطور که از اسمش پیداست، محلی برای ذخیره Cookie هاست و در این مورد، حاوی اطلاعات Session ای هستش که شما سمت سرور تولید می کنید. این اطلاعات در این bag ذخیره میشن و با رفت و آمدهای بعدی، به سرور ارسال میشن و همه چی اونطوری که به نظر می رسه کار میکنه....
اما یه نکته. یکی از خوبیهای وب سرویس ها، اینه که state-less هستن. شما با این کار دارید وب سرویس رو به وضعیت state-full می برید و باید خیلی مراقب باشید که چیکار می کنید. State-full کردن یک وب سرویس به صرف رد و بدل کردن ID/PWD مطلقا کار درستی نیست و من اینو به هیچکس توصیه نمیکنم، اگر چه روش کار رو توضیح دادم.