دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام
بستن تبلیغات
تسلط کامل بر سی‌شارپ با یک دوره پروژه‌محور

یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شی‌گرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفه‌ای و امکانات کامل!

مشاهده بیشتر
تسلط جامع بر MVC Core برای توسعه وب حرفه‌ای

یادگیری MVC Core از مبانی تا پیشرفته: شی‌گرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژه‌های کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!

مشاهده بیشتر

روش های ایجاد نمونه از سرویس WCF

دوره های پیشنهادی

WCF –روش های ایجاد نمونه از سرویس (Instance management)

مجموعه تکنینک هایی که WCF برای bind کردن پیغام ها (مجموعه درخواست های کلاینت) به نمونه های سرویس (service instance) مورد استفاده قرار می دهد در اصطلاح Instance Management خوانده می شود.WCF برای ایجاد نمونه از سرویس (فعال سازی نمونه / Instance activiation) از سه روش بهره می گیرد که در زیر به شرح هریک خواهیم پرداخت.

فعال سازی و ایجاد نمونه از سرویس به روش Per-Call Service

Per-call service حالت پیش فرض ایجاد نمونه از سرویس در WCF می باشد. زمانی که یک سرویس WCF را برای per-call service تنظیم می کنید (زمانی که حالت ایجاد نمونه از سرویس را بر روی per-call service قرار می دهید)، همزمان یک شی CLR برای طول مدتی که درخواست (client call) فعال است، ایجاد می شود (در واقع به ازای هر درخواست یک نمونه ساخته می شود). CLR مخفف common language runtime بوده و (در WCF) نمونه های ایجاد شده از سرویس را نیز شامل می شود.

در این روش ایجاد نمونه از سرویس، برای هر درخواست کلاینت یک نمونه سرویس جدید ایجاد می شود و نیز میزان استفاده از حافظه در مقایسه با دیگر روش های ایجاد نمونه (instance activation) کم تر می باشد.

برای ایجاد نمونه از سرویس به این روش، لازم است خاصیت (property) InstanceContextMode را با InstanceContextMode.PerCall مقداردهی کنید. property نام برده از خصیصه (attribute) ServiceBehavior گرفته شده است. در زیر نحوه ی تنظیم حالت ایجاد نمونه (از سرویس) بر روی per-call service را مشاهده می کنید:

 [ServiceContract]

interface IMyContract

{...}

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]

class MyService : IMyContract

{...}

نام سرویس در این مثال IMyContract می باشد. تصویر زیر فرایند فعال سازی (ایجاد نمونه از) سرویس به روش per-call service را نشان می دهد:

آموزش WCFپیاده سازی سرویس per-call service:

[DataContract]

class Param {....}

[ServiceContract]

interface IMyContract

{

  [OperationContract]

  void MyMethod(Param objectIdentifier);

}

class MyPerCallService : IMyContract, IDisposable

{

  public void MyMethod(Param objectIdentifier)

  {

     GetState(objectIdentifier); 

     DoWork();

     SaveState(objectIdentifier);

  }

  void GetState(Param objectIdentifier) {....}

  void DoWork() {....}

  void SaveState(Param objectIdentifier) {....}

  public void Dispose() {....}

}

در مثال حاضر، Param پارامتر از نوع pseudo type است که صرفا ویژه ی مثال فوق ایجاد شده است.

ایجاد نمونه از سرویس به روش Per-Session

در این روش ایجاد نمونه از سرویسWCF (زمانی که سرویس خود را بر روی حالت per-session تنظیم می کنید)، یک نمونه session زمینه ی تعامل نمونه سرویس و سرویس گیرنده را فراهم می کند (در این روش به ازای هر درخواست نمونه ی جدید ایجاد نشده و سرویس در یک session ذخیره می شود). این نوع سرویس که تحت عنوان private session service نیز شناخته می شود، یک نمونه جدید از سرویس فراهم می کند که مختص به درخواست یک کلاینت معین باقی مانده و از دیگر نمونه های (مربوطه به) آن سرویس session-aware کاملا مستقل است (session-aware = هیچگاه session پر نشده و متعاقبا حذف نمی شود).

به منظور ایجاد یک سرویس per-session، می بایست خاصیت (property) InstanceContextMode را با PerSession مقدار دهی کنید. در این سناریو نمونه ی سرویس در تمام طول مدت session در حافظه باقی خواهند ماند.

لازم به ذکر است که این حالت ایجاد نمونه سرویس فاقد قابلیت توسعه (مقیاس پذیری و scalability) می باشد. بدین معنی که سرویس تنظیم شده قادر به پشتیبانی از کلاینت های (مدیریت نشده) اضافی بر سازمان، به جز تعداد محدودی نیست.

نحوه ی تنظیم سرویس per-session در زیر به نمایش گذاشته شده است:



 [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]

class MyService : IMyContract

{...}

پروسه ی ایجاد نمونه از سرویس به روش per-session service در زیر به نمایش گذاشته شده استآموزش WCF

کد زیر یک contract و service را نشان می دهد که برای استفاده ی private session تنظیم شده است. خروجی کد نشان می دهد که به کلاینت مورد نظر یک نمونه خاص از سرویس اختصاص داده شده است.

کد سرویس:

 [ServiceContract(Session = true)]

interface IMyContract

{

  [OperationContract]

  void MyMethod();

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

class MyService : IMyContract, IDisposable

{

  int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); } 

  public void MyMethod()

  {

     m_Counter++;

     Console.WriteLine("Counter = " + m_Counter);

  }

  public void Dispose() 

  { 

     Console.WriteLine("MyService.Dispose()"); 

  }

}

کد کلاینت:

MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); 

proxy.Close();

خروجی

MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()

Singleton service (ایجاد یک نمونه ی واحد از سرویس)

در این روش از ایجاد نمونه از سرویس، تمامی درخواست ها مستقل از یکدیگر کلاینت ها، صرف نظر از connection آن ها به درگاه های سرویس (service endpoint)، به یک نمونه ی واحد مشخص از سرویس متصل می شوند. زمانی که سرویس بر روی این مد تنظیم شده باشد، یک نمونه ی واحد از سرویس برای تبادل داده با برنامه ی سمت کلاینت ساخته می شود. نمونه ی ایجاد شده در زمان ایجاد host (میزبانی) ساخته شده و با خاموش و غیرفعال شدن آن نیز حذف (dispose) می شود.

به عبارتی دیگر، سرویس یکبار به هنگام ایجاد host ساخته می شود. در صورتی که نمونه ی واحدی از سرویس در اختیار host قرار نگیرد، مقدار NULL برگردانده می شود. این حالت در شرایطی بسیار کارامد است که بار کاری در هر فراخوانی متد محدود بوده و هیچ عملیات معلقی در پس زمینه وجود نداشته باشد.

برای تنظیم سرویس با این حالت، می بایست مقدار خاصیت (property) InstanceContextMode را بر روی InstanceContextMode.Single تنظیم نمایید.

نحوه ی تنظیم سرویس Singleton در زیر نمایش داده شده است:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

class MySingleton : ...

{...}

فرایند ایجاد نمونه از سرویس به روش singleton service در زیر نمایش داده شده است:آموزش WCF

کد زیر برای ایجاد نمونه ی واحد از سرویس و میزبانی آن نوشته شده است:

کد سرویس:

[ServiceContract]

interface IMyContract

{

  [OperationContract]

  void MyMethod( );

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

class MySingleton : IMyContract

{

  int m_Counter = 0;

  public int Counter

  {

     get

     {

        return m_Counter;

     }

     set

     {

        m_Counter = value;

     }

  }

  public void MyMethod( )

  {

     m_Counter++;

     Trace.WriteLine("Counter = " + Counter);

  }

}

کد host:

MySingleton singleton = new MySingleton( );

singleton.Counter = 42;

ServiceHost host = new ServiceHost(singleton);

host.Open( );

//Do some blocking calls then

host.Close( );

کد کلاینت:

MyContractClient proxy = new MyContractClient( );

proxy.MyMethod( );

proxy.Close( );

خروجی:

Counter = 43
1395/05/12 2282 4
نظرات شما

نظرات خود را ثبت کنید...