Session در WCF
یکشنبه 23 آبان 1395بصورت پیش فرض ، WCF از Session ها پشتیبانی نمیکند . برای استفاده از Session ها در WCF یک سرویس ایجاد خواهیم کرد . در ادامه این مقاله ، به بررسی چگونگی استفاده از Session در WCF خواهیم پرداخت .
معرفی :
قبلا در زمان استفاده از این عملکرد ، ما باید اطمینان حاصل میکردیم که به نگهداری Session نیازمندیم یا خیر .
برای مثال ، یک برنامه بانکداری داشته باشیم ، همیشه نیازمند دادن Balance بروزرسانی شده به برنامه هستیم ، و اصلا نیازی به نگهداری Session نداریم . اما اگر ما یک برنامه E-commerce (فروشگاه اینترنتی) داشته باشیم که در آن کاربر بدون log in کردن در سیستم توانایی اضافه کردن کالا به سبد خریدش را دارد ، در اینجا نیاز به نگهداری Session داریم .
اگر ما قصد استفاده از Session را داریم ، Binding نیز بسیار مهم است . NetTCPBinding و NetNamedPipeBinding فقط از این ویژگی پشتیبانی میکنند . اگر ما بدون هیچ Binding تلاش به پیکربندی کنیم ، سرویس ما خطایی را با مضمون اینکه binding از session پشتیبانی نمیکند ، را ارائه میدهد .
در زمان استفاده از Session ، ما میتوانیم روی فراخوانی متدی که برای شروع Session و خاتمه Session نیاز است ، کنترل داشته باشیم .
با استفاده از صفت IsInitiating ، ما می توانیم مشخص کنیم که کدام متد برای شروع و اغاز Session نیاز است و IsTerminating مشخص میکنیم که کدام متد برای خاتمه Session مورد استفاده قرار میگیرد .
حال برای نشان دادن چگونگی استفاده از Session مزایای آن ، به سراغ ایجاد یک سرویس جدید می رویم :
1. ابتدا سرویس خود را ایجاد میکنیم . برای ایجاد سرویس تصویر زیر را دنبال کنید . نام پروژه خود را MerchandiseService بگذارید و Ok را بزنید .
2. بصورت پیش فرض ، ما فایل های IService1 و Service1.cs را خواهیم داشت . حال نام IService1 را تغییر دهید و IMerchandiseService بگذارید و Service1 را نیز MerchandiseService بگذارید .
3. ما 4 متد Login, AddToCart , ReviewCart و CheckOut خواهیم داشت . Login وظیفه آغاز Session را دارد و CheckOut وظیفه خاتمه Session را دارد . حال ، به سراغ تعریف این متد ها در Interface مان میرویم .
4. برای کنترل استفاده از Session مقدار مشخصه SessionMode از صفت ServiceContract را مساوی با True میگذاریم .
5. همچنین توجه داشته باشید که Binding را به WsHttpBinding تغییر دهید . basicHttpBinding از Session پشتیبانی نمیکند . ما این را در فایل app.Config پیدا خواهیم کرد
<endpoint address=”” binding=”wsHttpBinding” contract=”MerchandiseService.IMerchandiseService”>
6. Session ما با متد Login آغاز و با متد CheckOut به پایان میرسد . حال متد ها را به Interface اضافه میکنیم :
using System.ServiceModel; namespace MerchandiseService { [ServiceContract(SessionMode = SessionMode.Required)] public interface IMerchandiseService { [OperationContract(IsInitiating = true, IsTerminating = false)] long Login(string loginName, string password); [OperationContract(IsInitiating = false, IsTerminating = false)] bool AddToCart(long loginId, long productId); [OperationContract(IsInitiating = false, IsTerminating = false)] bool ReviewCart(long cartId); [OperationContract(IsInitiating = false, IsTerminating = true)] bool CheckOut(long CartId); } }
7. در این تعریف ، IsInitiating = true در Login تنظیم میشود این مشخص میکند که Session آغاز خواهد شد و IsTerminating = true در CheckOut تنظیم میشود که مشخص میکند این متد نهایی است و باید در انتها فراخوانی شود .
8. حال به سراغ پیاده سازی سرویس مشابهی میرویم . ما از مقادیر hard-coded استفاده خواهیم کرد ، اما اگر مثالی در دنیای واقعی بخواهیم بزنیم ، این DataAccessLayer خواهد بود :
namespace MerchandiseService { // NOTE: You can use the "Rename" command on the "Refactor" menu // to change the class name "Service1" in both code and config file together. public class MerchandiseService : IMerchandiseService { public bool AddToCart(long loginId, long productId) { return true; } public bool CheckOut(long CartId) { return true; } public long Login(string loginName, string password) { return 10001; } public bool ReviewCart(long cartId) { return true; } } }
9. زمانی که سرویس انجام شد ، F5 را بزنید تا ببینید کار میکند یا نه ، یک Client اضافه کنید و از آن استفاده کنید . ما از Console Application برای دیدن چگونگی کارکرد آن ، استفاده میکنیم
10. روی پروزه کلیک راست کرده و یک پروژه Console Application با نام MerchandiseClient به پروژه اضافه کنید و Ok را بزنید .
11. حال reference service را به پروژه اضافه میکنیم ، روی Reference کلیک راست کرده و Add reference service را بزنید . در این پروژه سرویس ما بر روی برنامه است اما در برنامه های واقعی سرویس ها بر روی یک سرور هستند و آدرس آن را باید بدهید،اما ما در اینجا آدرس برنامه خود را میدهیم و ok را میزنیم .
12. زمانی که سرویس یافت شد ، شما میتوانید روی سرویس کلیک کرده و متد های زیر سرویس را دریافت کنید . namespace را به MerchandiseService تغییر دهید روی Advanced کلیک کنید و از Collection Type
System.Collections.Generic.List را انتخاب کنید .
13. این reference ها در فایل web/app.config در دسترس خواهند بود و زمانی که ما بخواهیم آن را روی سرور دیگری مستقر کنیم ، آن را تغییر میدهیم . ما میتوانیم <endpoint> را در فایل Config پیدا کنیم .
14. حال به سراغ برنامه بروید و از سرویس استفاده کنید :
using MerchandiseClient.MerchandiseService; using System; namespace MerchandiseClient { class Program { static void Main(string[] args) { try { using (MerchandiseServiceClient client = new MerchandiseServiceClient()) { long loginId = client.Login("test", "test"); if (loginId > 0) { Console.WriteLine("User loggedin"); } bool resultCart = client.AddToCart(loginId, 34445); if (resultCart) { Console.WriteLine("Product Added to Cart"); } bool resultReview = client.ReviewCart(345436); if (resultReview) { Console.WriteLine("Cart review successful"); } bool resultCheckOut = client.CheckOut(767867); if (resultCheckOut) { Console.WriteLine("Order Placed"); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } }
15. حال F5 را بزنید ، باید خروجی زیر را دریافت کنید :
16. حال برای اینکه بفهمیم وضعیت Session تحت مدیریت ما است ، متد CheckOut را فراخوانی میکنیم :
using MerchandiseClient.MerchandiseService; using System; namespace MerchandiseClient { class Program { static void Main(string[] args) { try { using (MerchandiseServiceClient client = new MerchandiseServiceClient()) { long loginId = client.Login("test", "test"); if (loginId > 0) { Console.WriteLine("User loggedin"); } bool resultCart = client.AddToCart(loginId, 34445); if (resultCart) { Console.WriteLine("Product Added to Cart"); } bool resultCheckOut = client.CheckOut(767867); if (resultCheckOut) { Console.WriteLine("Order Placed"); } bool resultReview = client.ReviewCart(345436); if (resultReview) { Console.WriteLine("Cart review successful"); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } }
17. زمانی که تغییرات انجام شد ، F5 را بزنید ، خروجی زیر را خواهیم دید ، که معرف این است که CheckOut فراخوانی شده است :
نتیجه گیری :
در اینجا چندین سوال مطرح است که آیا ما واقعا به Session نیاز داریم یا خیر . در اکثرا موارد ، نیازی به آن نیست . اما در مواردی که ما نیاز به نگهداری وضعیت داریم ، ما میتوانیم از این ویژگی قدرتمند در WCF استفاده کنیم .
در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .
- WCF
- 2k بازدید
- 3 تشکر