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 تشکر