WCF چیست؟ قسمت چهارم - میزبانی و اجرای یک سرویس WCF

میزبانی و اجرای یک سرویس WCF

در این مقاله نحوه میزبانی سرویس ارتباطی ویندوز (WCF) را در یک برنامه کنسول توضیح می دهیم. این کار شامل مراحل زیر است:
1) یک پروژه برنامه کنسول برای میزبانی این سرویس ایجاد می کنیم.
2) یک میزبان سرویس برای سرویس ایجاد شده قبلی ایجاد می کنیم.
3) metadata exchange را فعال می کنیم.
4) میزبان سرویس را اجرا می کنیم.

برای ایجاد یک برنامه کنسول جدید برای میزبانی این سرویس چنین عمل می کنیم.
1)  برای ایجاد یک پروژه کنسول جدید، پروژه قبلی که ایجاد کردیم را ( در قسمت سوم مقاله ) با دسترسی Administrator باز کنید، حال  از منوی File ، زیر منوی Add و سپس زیر منوی Add New Project را انتخاب نمایید.

Add New Project

حال از باکس سمت چپ صفحه باز شده، در زیر منوی Visual C# و سپس زیر منوی Windows Classic Desktop  را انتخاب و سپس   Console App (.Net FramwWork) را انتخاب کنید. و  در زیر صفحه عبارت GettingStartedHost را به عنوان نام پروژه جدید وارد کنید و سپس  کلید Ok را بزنید تا پروژه کنسول جدید داخل Solution ما ایجاد گردد.  ممکن است در زیر منوی Visual C#  مربوط به VS شما، به جای زیر منوی Windows Classic Desktop منوی Windows باشد و نیز به جای Console App (.Net FramwWork) عبارت Console Application باشد.

Create Console Application

2) حال باید نسخه دات نت فریم وورک را بررسی می کنیم. روی پروژه ایجاد شده در Solution Explorer که GettingStartedHost  نام نهادیم کلیک راست را زده و سپس روی Properties کلیک می کنیم تا باکس مربوطه باز گردد. در منوی آبشاری زیر عبارت Target Framework مورد  .Net Framework 4.5 را انتخاب نمایید.( برای تغییر نسخه دات نت فریم وورک دوستانی که پروژه خود را با سینتکس VB می نویسند از این لینک کمک بگیرید، چون با روش توضیح داده شده کمی تفاوت دارد.)  این کار ممکن است باعث شود تا Solution دوباره Load شود، در این صورت پیغامی در باکسی ظاهر می شود، حال کلید  YES را کلیک کنید تا تغییر نسخه دات نت فریم وورک صورت گیرد.

Target Framework

3) حال باید در پروزه کنسول ایجاد شده به سرویس خود که در یک پروژه دیگر ایجاد شده است Reference دهیم و پیوند بین این دو پروژه را ایجاد کنیم، چون سرویس ما مستقل است و می تواند در پروژه های دیگر مورد استفاده قرار گیرد، بنا براین نیاز است که در پروژه کنسول ویندوز به  آن Reference   دهیم. برای این کار چنین عمل می کنیم.
در داخل پروژه GettingStartedHost و روی فولدر  References کلیک راست می کنیم  و سپس روی Add Reference کلیک می کنیم.  در ستون سمت چپ زیر منوی projects ،  روی Solution کلیک می کنیم تا در سمت راست لیست پروژه های داخل Solution نمایش داده شود ( غیر از خود پروژه جاری ) و GettingStartedLib را انتخاب می کنیم. و سپس کلید Ok را کلیک می کنیم تا  Reference پروژه ای که سرویس ما داخل آن است به پروژه کنسول ما اضافه شود تا کلیه کلاس ها و توابع و پارامتر های تعریف شده داخل این پروژه (GettingStartedLib) در دسترس  پروژه کنسول قرار گیرد.
برای استفاده از سرویس ایجاد شده نیاز داریم تا یک Reference دیگری را نیز از کتابخانه خود دات نت به Reference های پروژه خود اضافه کنیم و آن ServiceModel است. برای این کار نیز دوباره روی فولدر  References کلیک راست می کنیم و سپس  مانند حالت قبلی Add Reference را کلیک می کنیم. حال در ستون سمت چپ در زیر منوی  Assemblies، روی زیر منوی Framework کلیک می کنیم تا انتخاب شود و سپس در  سمت راست لیست کلیه کلاس های داخل کتاب خانه دات نت فریم وورک نمایش داده شوند، از داخل آنها  System.ServiceModel را یافته و آن را انتخاب می کنیم و سپس  کلید Ok را کلیک می کنیم تا  Reference این کلاس نیز به پروژه اضافه شود.
فایل Program.cs را باز کنید و کد زیر را داخل آن کپی کنید.

// program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using GettingStartedLib;
using System.ServiceModel.Description;

namespace GettingStartedHost
{
    class Program
    {
        static void Main(string[] args)
        {
            // Step 1 Create a URI to serve as the base address.
            Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");

            // Step 2 Create a ServiceHost instance
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            {
                // Step 3 Add a service endpoint.
                selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");

                // Step 4 Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                // Step 5 Start the service.
                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press ENTER to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }
        }
    }
}
حال توضیحاتی در رابطه با کد های نوشته شده ارائه می کنیم، همانطور که می بینید، کد ها با عبارت Step مشخص شده اند که توضیحات ارایه شده بر آن اساس خواهد بود.
مرحله 1) یک نمونه از کلاس Uri را برای نگهداری آدرس پایه سرویس ایجاد می کنیم. سرویس ما با URL شناسایی می شود که شامل یه آدرس پایه و یک URI اختیاری است. استاندارد نوشتن آدرس پایه به شکل زیر است:
[transport]://[machine-name or domain][:optional port #]/[optional URI segment]
در آدرس پایه، ما برای کلاس Calculator از پروتوکل http استفاده می کنیم، پس به جای  transport از عبارت http استفاده می کنیم. نام ماشینی را هم که کد خود را داخل آن اجرا می کنیم  localhost است و از پورت 8000 و بخش انتهایی URI با نام  GettingStarted استفاده  می کنیم.
مرحله 2) یک نمونه از کلاس ServiceHost را برای میزبانی این سرویس ایجاد می کند. سازنده کلاس (Constructor) دو پارامتر را می گیرد، نوع کلاس که قرارداد سرویس را پیاده سازی می کند و آدرس پایه سرویس.
مرحله 3)  در این مرحله یک نمونه از ServiceEdPoint ایجاد می کنیم. نقطه پایانی سرویس یا همان Service Endpoint  از یک آدرس، یک اتصال دهنده (binding) و یک قرار داد سرویس تشکیل شده است. متد سازنده کلاس سه پارامتر را به عنوان ورودی دریافت می کند: نوع اینترفیس قرار داد سرویس، اتصال (binding) و آدرس. قرار داد سرویس همان  ICalculator است که در کلاس سرویس پیاده سازی شده است. نوع اتصالی هم که در این مثال استفاده شده است یک نمونه از WSHttpBinding است که برای اتصال به Endpoint (نقطه های انتهایی) استفاده می شود. این نوع اتصال منطبق با استاندارد های WS-*  می باشد. در مورد انواع اتصال هم که قبلا توضیحات مختصری ارایه شده است و در صورت امکان تلاش خواهیم کرد نمونه کد های مشابه کد های فعلی که با انواع Binding های دیگر پیاده سازی شده اند داشته باشیم. آدرسی نیز که در اینجا استفاده شده است به انتهای آدرس پایه اضافه می شود که endpoint را نیز شناسایی می کند و چیزی نیست جز  CalculatorService. بنابراین آدرس کامل برای Endpoint  چنین خواهد بود:  "http://localhost:8000/GettingStarted/CalculatorService"
زمانی که از دانت فریم وورک نسخه 4.0 و بالاتر استفاده می کنیم اضافه کردن نقطه پایانی سرویس اختیاری خواهد شد.در این نسخه ها اگر هیچ نقطه انتهایی در کد یا پیکربندی اضافه نشود، WCF یک نقطه پایانی پیش فرض را برای هر ترکیبی از آدرس پایه و قرارداد که توسط سرویس پیاده سازی می شود، می افزاید.
مرحله 4)  در این مرحله Metadata Exchange (مبادله فراداده) باید فعال شود. به دلیل این کار انجام می شود تا استفاده کنندگان از سرویس بتوانند پروکسی هایی ایجاد کنند تا بتوانند از طریق آنها عملیات داخل سرویس را فراخوانی کنند. برای فعال کردن metadata exchange باید یک نمونه از کلاس   ServiceMetadataBehavior ایجاد کنیم و  ویژگی HttpGetEnabled آن را برابر با true قرار دهید. و  Behavior ایجاد شده را به لیست behavior های نمونه ServiceHostایجاد شده اضافه کنید.
مرحله 5)   حال باید رویداد باز کردن یا آماده کردن   ServiceHost را صدا بزنیم که منتظر پیام های دریافتی باشد. ( منتظر رسیدن دستور باشد ) توجه داشته باشید که کد نوشته شده منتظر کاربر است تا کلیدی را فشار دهد.  اگر کلیدی را فشار ندهیم برنامه بلادرنگ بسته خواهد شد و سرویس نیز به همین ترتیب بسته خواهد شده ( خاموش خواهد شد ). به کد Try/Catch استفاده شده در کد نیز دقت کنید.بعد از این که یک کلاس از SereviceHost ایجاد گردید بقیه کد ها همه داخل Try قرار گرفته اند.  تا بتوان خطای احتمالی که ممکن است در کد رخ دهد را مدیریت کرد.
 حال می خواهیم ببینیم کد نوشته شده درست کار می کند با نه:
1) برنامه ( پروژه ) GettingStartedHost  را از داخل VS اجرا کنید. بهتر است VS  در ابتدا با دسترسی  Administrator اجرا شده باشد.
2) یکی ار مرور گر های خود را اجرا کرده و سپس آدرس و لینک زیر را فراخوانی کنید. ( در قسمت آدرس بار مرورگر خود وارد کرده و سپس کلید Enter را فشار دهید )
http://localhost:8000/GettingStarted/
دقت داشته باشید نسخه دات نیت فریم وورک هر دو پروژه باید برابر با 4.5 باشد و نحوه تغییر آن را در سطور بالا توضیح داده ایم. در صورت بروز خطای کامپایل نسخه فریموورک هر دو پروژه را یکسان کنید ( 4.5 )
همانطور که میبینید صفحه Command اجرا شده و به ما اعلام میدارد که سرویس نوشته شده به طور صحیح اجرا شده است و منتظر عکس العمل کاربر است.

منابع:
 
Developing Service-Oriented Applications with WCF


آخرین بروزرسانی
۱۶ اسفند ۱۴۰۲ 
تعداد کلیک
۴,۹۵۱

فهرست نظرها و ارسال نظر جدید

نام را وارد کنید
ایمیل را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید