Session در WCF

بصورت پیش فرض ، WCF از Session ها پشتیبانی نمیکند . برای استفاده از Session ها در WCF یک سرویس ایجاد خواهیم کرد . در ادامه این مقاله ، به بررسی چگونگی استفاده از 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 استفاده کنیم .

دانلود نسخه ی PDF این مطلب