آموزش ایجاد یک سرویس WCF
اولین کاری که هنگام ایجاد یک سرویس WCF باید انجام دهیم ، تعیین یک قرارداد خدمات
( Service Contract ) است. Service Contract مشخص می کند که سرویس ما چه
عملیاتی را پشتیبانی می کند. عملیات اشاره شده را می توان به عنوان یک متد
وب سرویس شناخت.
قراردادها با تعریف یک اینترفیس (Interface) و توسط یکی از زبان های
#C++ ، C یا ویژوال بیسیک (VB) ایجاد می شوند.
هر متد درون اینترفیس به یک عملیات مستقل داخل سرویس مرتبط می شود. یعنی به
ازای هر متد تعریف شده داخل اینترفیس یک متد متناظر داخل کلاس مرتبط با
اینترفیس وجود دارد که متد مربوطه بدنه داشته و کد های لازم داخل آن پیاده
سازی شده اند.
هر اینترفیس باید مشخصه ServiceContract را داشته باشد که به آن اعمال می
شود و هر عملیات ( متد ) باید دارای مشخصه Operation Contract باشد.
در بخش های بعدی نحوه تعریف مواردی که اشاره می شود داخل نمونه کد توضیح
داده می شود.
اگر متدی را داخل اینترفیس ( که مشخصه ServiceContract دارد ) تعریف
کنیم ولی مشخصه OperationContract را به آن تخصیص ندهیم، این متد توسط
سرویس در دسترس نخواهد بود، و به عنوان یک تابع داخلی دورن خود سرویس قابل
استفاده خواهد بود. یعنی سرویس گیرنده ها و برنامه نویس هایی که از سرویس
استفاده می کنند قادر به دیدن این متد و استفاده از آن نخواهند بود.
نحوه ایجاد یک سرویس ساده در توضیحات و کدی که در زیر می آوریم توضیح داده
می شود:
برای ایجاد یک Service Contract چنین عمل می کنیم:
برنامه Visual Studio 2015 و یا نسخه 2017 ( و یا هر نسخه دیگری
که WCF را پشتیبانی می کند ) را در حالت Administrator اجرا کنید. ( اگر
visual studio را در حالت Administrator اجرا نکنیم، برای اجرای کد
های برنامه در حالت اجرای خط به خط به مشکل خواهیم خورد، به زبان خودمانی
دیگر نخواهیم توانست برنامه را Trace کرده و خطای احتمالی را بررسی و آن را
تصحیح کنیم ). برای این کار سراغ منوی Start ویندوز رفته و آیکون Visual
Studio را از داخل برنامه ها پیدا کنید. حال روی آیکون مربوط به Visual
Studio کلیک راست موس را بفشارید و سپس روی عبارت Run as
administrator کلیک کنید تا ویژوال استودیو در حالت Administrator
اجرا شود.
به سراغ منوی File، سپس New و سپس Project بروید.
بعد از کلیک روی دکمه اشاره شده، صفحه زیر باز خواهد شد.
از لیست منوهای سمت چپ، منوی Visual c# سپس زیر منوی WCF و سپس WCF
Service Library رو انتخاب نمایید. در مقابل عبارت Name و در
باکس تعبیه شده نام پروژه مورد نظر خود و در مقابل Location، مسیر مورد نظر
خود را که می خواهید فایل های پروژه در آن پوشه ذخیره شوند را انتخاب کرده
و یا مسیر مورد نظر خود را Copy/Paste نمایید،
در صورتی که باکس بعدی که عبارت Solution Name در مقابل آن قرار دارد
نیز فعال باشد، می توانید یک نام نیز برای Solution انتخاب کنید. ما عبارت
GettingStartedLib را به عنوان نام انتخاب کرده و عبارت GettingStarted را
به عنوان Solutuon Name در نظر می گیریم. اگر چک باکس موجود در پایین
سمت راست صفحه با عنوان Create directory for solution انتخاب شده باشد،
امکان وارد کردن نام برای Solution فعال خواهد شد. حال کلید OK را کلیک
کنید و منتظر شوید تا Solution و پروژه داخل آن ایجاد گردد.
اگر همه چیز به خوبی و خوشی پیش رفت، VS ( منظور Visual Studio است ) 3
فایل داخل پروژه ایجاد خواهد کرد. این سه فایل عبارتند از IService1.cs ،
Service1.cs و App.config.
IService1 همان اینتر فیس شامل Service Contract است و Service1.cs هم شامل
بدنه متد های تعریف شده داخل IService یعنی همان Service Contract است.
فایل App.config نیز پیکر بندی های لازم برای اجرای این سرویس را داراست.
فایل IService1 و Service1 را باز کرده و کد های ایجاد شده داخل Namespace
را پاک کنید تا بتوانیم کد های خودمان را جایگزین کنیم.
کد های زیر را داخل Namespace در اینترفیس (IService) وارد کنید:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
همانطور که مشاهده می کنید ، اینترفیس ICalculator با عبارت
ServiceContract مشخص شده است. و نیز سر متد های نوشته شده هم با
عبارت OperationContract مشخص شده اند.
حال برای بدنه کلاس مربوطه ، کد های زیر را داخل Namespace موجود در کلاس
Service.cs وارد کنید:
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
double result = n1 + n2;
Console.WriteLine("Received Add({0},{1})", n1, n2);
// Code added to write output to the console window.
Console.WriteLine("Return: {0}", result);
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
Console.WriteLine("Received Subtract({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
Console.WriteLine("Received Multiply({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
Console.WriteLine("Received Divide({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
}
حال Service Contract ما ایجاد و آمده اجرا شده است، یک بار Solution را
Build کنید تا مطمئن شویم که خطای کامپایل نداریم. برای تست این
سرویس میتوانیم آن را اجرا کرده و نتیجه را مشاهده کنیم، منتها پیش از آن
باید تغییراتی در App.config اعمال کنیم. متن کامل Web.config ایجاد شده را
در زیر قرار می دهیم و سپس به بخش هایی که باید منطبق با تغییرات اعمال شده
در کلاس و اینترفیس، عوض شوند را نیز اشاره می کنیم. ( ممکن است محتوای
فایل App.Config ایجاد شده توسط شما کمی متفاوت باشد ، ولی بخش های اصلی و بنیادی در
همه App.Config های ایجاد شده توسط بقیه VS ها وجود خواهند داشت.)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the
config file must be added to the host's
app.config file. System.Configuration does not support config files for
libraries. -->
<system.serviceModel>
<services>
<service name="GettingStartedLib.Service1">
<host>
<baseAddresses>
<add baseAddress =
"http://localhost:8733/Design_Time_Addresses/GettingStartedLib/Service1/"
/>
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- Unless fully qualified, address is relative to base address
supplied above -->
<endpoint address="" binding="basicHttpBinding"
contract="GettingStartedLib.IService1">
<!--
Upon deployment, the following identity element should be removed or
replaced to reflect the
identity under which the deployed service runs. If removed, WCF will
infer an appropriate identity automatically.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- The Metadata Exchange endpoint is used by the service to describe
itself to clients. -->
<!-- This endpoint does not use a secure binding and should be secured
or removed before deployment -->
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
همانطور می می بینید دو عبارت با رنگ قرمر متمایز شده است که باید تغییر
یابند. ما در ابتدا کد های داخل کلاس Service1 و اینترفیس IService1
را حذف و کد های دیگری جایگزین کردیم، بنابراین نام کلاس از Service1 به
CalculatorService و همچنین نام اینترفیس نیز از IService1 به
ICalculator تغییر یافت. بنابراین همین تغییرات را در App.config نیز اعمال
می کنیم. پس تغییرات زیر حاصل خواهد شد:
عبارت
<service name="GettingStartedLib.Service1">
به شکل زیر تغییر خواهد کرد:
<service name="GettingStartedLib.CalculatorService">
و سطر
<endpoint address="" binding="basicHttpBinding"
contract="GettingStartedLib.IService1">
نیز به شکل زیر تغییر پیدا خواهد کرد:
<endpoint address="" binding="basicHttpBinding"
contract="GettingStartedLib.ICalculator">
نام کلاس و اینترفیس قدیمی را با کلاس و اینترفیس جدید جایگزین کردیم.
برای اجرای سرویس روی کلید Start در VS کلیک کنید. و یا کلید F5 کیبورد را
فشار دهید تا برنامه ( سرویس ) ایجاد شود.
بعد از اجرای سرویس صفحه زیر ظاهر خواهد شد.
نحوه تست متد های داخل کلاس سرویس در سمت راست صفحه باز شده توضیح داده شده
است.
برای تست هر کدام از متد ها روی نام متد در ستون سمت چپ دبل کلیک
کنید تا محیط تست آن ظاهر شود. برای تست متد ()Add روی آن دبل کلیک کنید تا تب مربوطه باز شود، حال عدد 5 را مقابل عنوان n1 در
ستون Value و همچنین عدد 10 را مقابل عنوان n2 در ستون Value
وارد کرده و سپس کلید Invoke را کلیک کنید. همانطور که میبینید
جواب تابع Add در باکس Response در زیر عبارت value نمایش داده
می شود ( عدد 15 ).
اگر بعد از کلیک روی کلید Invoke پیغامی مبتنی بر Security Warning مشاهده
کردید، کلید yes را فشار دهید.
میتوانید بقیه توابع و متد های نوشته شده در کلاس را به همین روش تست کنید.