WCF چیست؟ قسمت سوم - آموزش ایجاد یک سرویس WCF

آموزش ایجاد یک سرویس 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 بروید.

File New Project

بعد از کلیک روی دکمه اشاره شده، صفحه زیر باز خواهد شد.

WCF Service Library
از لیست منوهای سمت چپ،  منوی 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 کیبورد را فشار دهید تا برنامه ( سرویس ) ایجاد شود.

Start Button

بعد از اجرای سرویس صفحه زیر ظاهر خواهد شد.

WCF Test Client

 نحوه تست متد های داخل کلاس سرویس در سمت راست صفحه باز شده توضیح داده شده است.
برای تست هر کدام از متد ها روی نام متد در ستون سمت چپ  دبل کلیک کنید تا محیط تست آن ظاهر شود. برای تست متد ()Add روی آن دبل کلیک کنید تا تب مربوطه باز شود، حال عدد 5 را مقابل  عنوان  n1 در ستون Value و همچنین عدد 10 را مقابل  عنوان  n2 در ستون Value وارد کرده و سپس   کلید Invoke را کلیک کنید. همانطور که میبینید جواب تابع Add در باکس Response در زیر عبارت value نمایش داده می شود ( عدد 15 ).

Test Client Result

اگر بعد از کلیک روی کلید Invoke پیغامی مبتنی بر Security Warning مشاهده کردید، کلید yes را فشار دهید.
میتوانید بقیه توابع و متد های نوشته شده در کلاس را به همین روش تست کنید.


 


منابع:

Windows Communication Foundation - Getting Started Tutorial



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

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

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