ایجاد یک سرویس گیرنده 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 به روش زیر:
نحوه رسیدن و پوشه حاوی برنامه exe و اجرای آن:
بعد از هر سطر از دستورات داخل CMD یک بار کلید Enter زده شده است. همانطور
که در دو سطر آخر می بینید سرویس میزبانی شده و آماده استفاده است. حال در
Solution خود، در پروژه GettingStartedClient و سپس روی فولدر
References کلیک راست می کنیم و سپس روی Add Service Reference کلیک
می کنیم تا صفحه مربوطه برای اضافه کردن سرویس نمایان شود. در صفحه باز شده
در مقابل Address ، آدرس مربوط به سرویس را
(http://localhost:8000/GettingStarted/)وارد کرده و سپس کلید Go
مقابل آن را کلیک می کنیم:
VS سرویس در حال اجرا را پیدا کرده و سپس در ستون سمت چپ کلاس
های موجود در سرویس و متد های داخل هر کدام را نمایش خواهد داد. برای این
کار کافی است را روی CalculatorService در ستون سمت چپ و سپس روی
ICalculator کلیک کنید تا متد های پیاده سازی شده را مشاهده بفرمایید.
حال کلید 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 برنامه را اجرا کنید ، خطای زمان اجرای زیر را
دریافت خواهید کرد:
پس ابتدا مثل قبل از طریق CMD به روش زیر سرویس را هاست می کنیم:
و سپس پروژه کلاینت خود را اجرا می کنیم. خروجی زیر را در CMD خواهیم
دید:
حال مقاله آموزشی ما تکمیل شد و ما توانستیم یک قرار داد خدمات (Service
Contract) تعریف کرده، آن را پیاده سازی کرده، یک پروکسی برای اتصال به
سرویس ایجاد کرده، برنامه سرویس گیرنده خود را ایجاد و پیکربندی کرده و سپس
با استفاده از پروکسی ایجاد شده سرویس و متد های داخل آن را فراخوانی
کنیم.