WCF چیست؟ قسمت پنجم - ایجاد یک سرویس گیرنده WCF

ایجاد یک سرویس گیرنده WCF

در اینجا نحوه بازیابی یک Metadata را از سرویس WCF ایجاد شده خواهیم دید، همچنین خواهیم دید که چگونه از این Metadata  برای ایجاد یک پروکسی WCF استفاده می کنیم تا با آن بتوان به سرویس دسترسی پیدا کرد.
این کار توسط قابلیت Add Service Reference تعبیه شده در VS فراهم شده است. این ابزار Metadata ی مورد نظر را از نقطه پایانی سرویس ( MEX endpoint )  بدست آورده و کد های مورد نیاز برنامه را برای سرویس گیرنده با زبان جاری انتخاب شده در VS تولید می کند. علاوه برا ایجاد پروکسی سرویس گیرنده ، این ابزار فایل پیکربندی سرویس گیرنده را ایجاد و یا در صورت نیاز بروز رسانی می کند تا برنامه سرویس گیرنده قادر شود تا در یکی از endpoint های آن به سرویس متصل شده و از آن استفاده کند.
همچنین  میتوان از ابزار ServiceModel Metadata Utility Tool (Svcutil.exe)  برای ایجاد کلاس مربوط به پروکسی مورد نیاز سرویس گیرنده و کد های مربوط به پیکربندی ، استفاده کرد.
برنامه سرویس گیرنده از کلاس پروکسی ایجاد شده برای اتصال به سرویس و استفاده از امکانات آن استفاده می کند.
برای ایجاد یک سرویس گیرنده WCF میتوان مراحل زیر را انجام داد:
1) یک پروژه جدید باید به Solutionجاری اضافه کنیم ، همانطور که پیش تر از این توضیح دادیم، داخل Solution در VS ، از منوی File، سپس زیر منوی Add ، سپس زیر منوی New Project را کلیک کرده و از منوهای سمت جپ باکس ظاهر شده ، زیر منوی Installed و سپس زیر منوی Visual C# و سپس Windows Classic Desktop را انتخاب می کنیم و در سمت راست پروژه Console App (.Net Framework ) را انتخاب می کنید.  نام این پروژه را GettingStartedClient قرار می دهیم و سپس کلید Ok  را فشار می دهیم و منتظر می مانیم تا پروژه مشخص شده به Solution اضافه شود.
2) مانند روشی که پیش از این توضیح داده ایم، نسخه دات نت فریموورک پروژه ایجاد شده را برابر 4.5 قرار دهید.
3) Reference مورد نیاز را به نام  System.ServiceModel به Reference های پروژه ایجاد شده نیز اضافه می کنیم ( نحوه انجام این کار پیش تر توضیح داده شده است )
4) حال باید Reference پروژه سرویس خود را نیز به این پروژه اضافه کنیم. پروژه سرویس ما که توسط پروژه قبلی هاست شده است باید در حالت اجرایی قرار گیرد، تا ما به این سرویس به وسیله URL دسترسی داشته باشیم. URL مربوطه که در کد پروژه GettingStartedHost تعیین شد http://localhost:8000/GettingStarted/  می باشد. ما باید بتوانبم سرویس خود را با URL اشاره شده به عنوان Service Reference به پروژه خود اضافه کنیم. برای اینکار ابتدا باید پروژه gettingStartedHost را به نحوی اجرا کنیم.
برای این کار باید سراغ فایل اجرایی پروژه برویم که با Build کردن Solution و پروژه GettingStartedHost ایجاد شده است. داخل پوشه GettingStarted رفته و سپس داخل پوشه مربوط به به پروژه که همان GettingStartedHost است بروید و سپس به داخل پوشه bin  و سپس داخل پوشه Debug بروید، در این پوشه یک فایل اجرایی exe منطبق با نام پروژه مربوطه وجود دارد که باید بوسیله Command اجرا شود. نام این فایل همانطور که مشاهده می کنید GettingStartedHost.exe می باشد. برای اجرای این برنامه توسط Coommand ویندوز، ابتدا باید برنامه Command Prompt ویندوز را با دسترسی Administrator اجرا کنید (Run As Administrator). و سپس دا دستورات Dos که خود می دانید فولدر حاوی برنامه Exe را فولدر جاری خود کنید و پس نام فایل اجرایی را تایپ کرده و کلیدEnter را بزنید تا سرویس ما در حالا میزبانی قرار گیرد تا در دسترس بقیه برنامه ها قرار گیرد. ما برای این کار به روش زیر عمل کردیم، شما باید مسیری که پروژه خود را در آن قرار دادید جایگزین مسیری را که ما در Command Prompt وارد کرده ایم ، بکنید:
اجرای Command Prompt به روش زیر:

Run Command Prompt

نحوه رسیدن و پوشه حاوی برنامه exe و اجرای آن:

Command Prompt

بعد از هر سطر از دستورات داخل CMD یک بار کلید Enter زده شده است. همانطور که در دو سطر آخر می بینید سرویس میزبانی شده و آماده استفاده است. حال در Solution خود،  در پروژه GettingStartedClient  و سپس روی فولدر  References  کلیک راست می کنیم و سپس روی Add Service Reference کلیک می کنیم تا صفحه مربوطه برای اضافه کردن سرویس نمایان شود. در صفحه باز شده در مقابل Address ، آدرس مربوط به سرویس را (http://localhost:8000/GettingStarted/)وارد کرده و سپس کلید  Go مقابل آن را کلیک می کنیم:

Add Service Reference

VS  سرویس در حال اجرا را پیدا کرده و سپس  در ستون سمت چپ کلاس های موجود در سرویس و متد های داخل هر کدام را نمایش خواهد داد. برای این کار کافی است را روی  CalculatorService در ستون سمت چپ و سپس روی  ICalculator کلیک کنید تا متد های پیاده سازی شده را مشاهده بفرمایید.

Select The Service

حال کلید Ok را فشار دهید تا سرویس میزبانی شده و در حال اجرای ما به Reference های پروژه اضافه گردد. نام Namespace را نیاز نیست در اینجا تغییر دهید اما در پروژه های خود حتما نام مناسب آن را وارد کنید. حال سرویس ما به پروژه اضافه شده است. برای اینکه پروژه Build  شود باید CMD را ببندیم تا پروژه Build شود و سپس دوباره مانند قبل اجرا کنیم.
بعد از این که Reference به پروژه اضافه شد، فایل App.config هم به صورت اتوماتیک توسط VS به پروژه اضافه می شود.پیکربندی سمت سرویس گیرنده شامل مشخص کردن Endpoint (نقطه پایانی) است که مشتری برای دسترسی به سرویس استفاده می کند. یک Endpoint (نقطه پایانی) یک آدرس، یک Binding (اتصال) و یک قرارداد دارد و هر کدام از آنها باید در فرایند پیکربندی مشتری مشخص شود. فایل App.Config را بررسی می کنیم. احتمالا محتوای فایل ایجاد شده در پروژه شما بسیار شبیه سطور زیر خواهد بود:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ICalculator" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8000/GettingStarted/CalculatorService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="ServiceReference1.ICalculator" name="WSHttpBinding_ICalculator">
                <identity>
                    <userPrincipalName value="shoarghadim@radcom.domain" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>
این پیکربندی Endpointی را که سرویس گیرنده برای استفاده از سرویس و پیدا کردن دسترسی به آن  نیاز دارد را  ایجاد می کند. این سرویس  نیز در آدرس زیر قرار دارد که خودمان ایجاد کرده بودیم
http://localhost:8000/GettingStarted/CalculatorService
عنصر endpoint داخل فایل Config ، مشخص می کند که قرار داد سرویس ما که  ICalculator نام دارد و با عبارت ServiceReference1.ICalculator در دسترس است برای ارتباط بین سرویس گيرنده و سرویس استفاده می شود. کانال WCF نیز با کد های داخلی سیستم و از پیش تعیین شده آن پیکر بندی شده است که در اینجا ار نوع Binding با نام  WsHttpBinding استفاده شده است. این قرارداد توسط VS بعد از اضافه کردن Reference سرویس به پروژه اضافه شده است که در اصل یک کپی از قرار دادی است که در پروژه خودش به نام  GettingStartedLib ایجاد کرده بودیم. این نوع binding که ایجاد شده است از پروتوکل Http برای انتقال اطلاعات  استفاده می کند که از امنیت متقابل و جزئیات پیکربندی دیگری تشکیل شده است.
به مجرد اینکه پروکسی مربوط به WCF ما ایجاد گردید، و سپس پیکربندی آن نیز انجام شد، سرویس گیرنده می تواند ایجاد شده و با سرویس ما ارتباط برقرار کرده و از متد های آن استفاده کند.
برای استفاده از سرویس ما سه کار انجام میدهیم:
1) یک نمونه از کلاینت برای WCF ایجاد می کنیم.
2) متد های داخل سرئیس را از طریق پروکسی ایجاد شده فراخوانی می کند
3) هنگامی که استفاده از سرویس و متد های آن به پایان رسید، سرویس گیرنده را می بندد
فایل Program.cs را که داخل پروژه  GettingStartedClient قرار دارد را باز کرده و کد زیر را داخل آن کپی کنید.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GettingStartedClient.ServiceReference1;
    
namespace GettingStartedClient
{
    class Program
        {
             static void Main(string[] args)
             {
                 //Step 1: Create an instance of the WCF proxy.
                 CalculatorClient client = new CalculatorClient();
    
                 // Step 2: Call the service operations.
                 // Call the Add service operation.
                 double value1 = 100.00D;
                 double value2 = 15.99D;
                 double result = client.Add(value1, value2);
                 Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
                 // Call the Subtract service operation.
                 value1 = 145.00D;
                 value2 = 76.54D;
                 result = client.Subtract(value1, value2);
                 Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
                 // Call the Multiply service operation.
                 value1 = 9.00D;
                 value2 = 81.25D;
                 result = client.Multiply(value1, value2);
                 Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
                 // Call the Divide service operation.
                 value1 = 22.00D;
                 value2 = 7.00D;
                 result = client.Divide(value1, value2);
                 Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    
                 //Step 3: Closing the client gracefully closes the connection and cleans up resources.
                 client.Close();
              }
         }
    }
توجه داشته باشید که ایمپورت کردن Service ، کد های داخل آن را از طریق پروکسی ایجاد شده در اختیار سرویس گیرنده قرار می دهد. این کد یک پروکسی WCF ایجاد کرده و سپس هر کدام از متد های داخل آن را که بخواهد فراخوانی کرده و سپس پروکسی را می بندد. برای تست کد نوشته شده ابتدا از طریق CMD که پیشتر نیز توضیح دادیم،  ابتدا GettingStartedHost  را در حالت اجرایی قرار دهید که سرویس هاست شده و در دسترس باشد و سپس GettingStartedClient را اجرا کنید. اگر بدون اجرا کردن  GettingStartedHost  برنامه را اجرا کنید ، خطای زمان اجرای زیر را دریافت خواهید کرد:

System.ServiceModel.EndpointNotFoundException

پس ابتدا مثل قبل از طریق CMD به روش زیر سرویس را هاست می کنیم:

Command Prompt  

و سپس  پروژه کلاینت خود را اجرا می کنیم. خروجی زیر را در CMD خواهیم دید:

WCF Client Execution Output

حال مقاله آموزشی ما تکمیل شد و ما توانستیم یک قرار داد خدمات (Service Contract) تعریف کرده، آن را پیاده سازی کرده، یک پروکسی برای اتصال به سرویس ایجاد کرده، برنامه سرویس گیرنده خود را ایجاد و پیکربندی کرده و سپس با استفاده از پروکسی ایجاد شده سرویس و متد های داخل آن را فراخوانی کنیم.

 


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



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

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

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