من در شروع اين بحث ترجيحا مطالب قبلي را مد نظر نمي گيرم چون حس و حال خواندن آنها را نداشتم و نقطه ابتدايي خودم را پايه ريزي مي كنم و سعي مي كنم ساده بنويسم و ضمنا چون اين مطالب را در حال حاضر مي نويسم احتمال اشتباه زياد است كه در صورت برخورد اطلاع دهيد .
خوب ، بهتره در ابتدا يه نگاه ساده داشته باشيم به اينكه واقعا WCF چه چيزي هست :
در واقع سرويس هاي WCF همون سريس هاي با پسوند asmx هستند با مقداري تفاوت كه اين امكان رو به ما مي دهند كه host هاي بيشتري رو براي ميزباني اين سرويس ها در نظر بگيريم و اينكه اين سرويس ها خيلي به استانداردهاي W3C نزديكتر شده اند و تفاوت هاي ديگري كه به آنها خواهيم رسيد و بهتره كه هر چه زودتر وارد عمل بشيم .
خوب ، فرض كنيم ما يك SERVICE داريم و مي خواهيم به آن وصل شويم ...اولين چيزي كه به اون نياز داريم اينكه يه جوري به كلاينت(ها) متدهايي رو كه سرويس ما ارائه ميدن رو اعلام كنيم .تو دنياي XML يكي از روش هايي كه ارگان W3C در نظر گرفته WSDL است (Web Service Description Language) .در حقيقت WSDL يك گرامر است كه ما توسط اون مي توانيم سرويسمون را حالا به هر زباني كه نوشته باشيم به دنياي بيرون ارائه بدهيم و WCF هم از اين قائده مستثني نيست ، يعني مي بايست عملكرد خود را بدين گونه شرح دهد .اين مسئله يك مزيت بزرگ دارد اونم اينه كه ما ،Tightly coupled بودن سرويسمون رو پايين آورديم يعني در حقيقت Binary Level Dependency نداريم چيزي كه در بسياري از تكنولو ژي گذشته مانند (.net remoting) مسئله اصلي بوده اند و در كل اين بدين معني است كه كلاينت به هيچ وجه به كد سرويس نيازي ندارد .(بعضي ها ممكن است خوب اين مسئله را متوجه نشوند كه مي توانند بپرسند).
با توجه به مطالب بالا به اين نتيجه مي رسيم كه ما بايد WSDL Document سرويس خود را در اختيار كلاينت ها قرار دهيم پس نقطه شروع مشخص شد : ايجاد WSDL. و سرويس WCF .
بهتره اول يه WCF سرويس ايجاد كنيم :
البته Visual Studio 2008 الگوي آماده WCF Service Library را دارد ولي ترجيحا بهتر است خودمون از پايه شروع كنيم پس يك Solution جديد با يك پروژه از نوع Class Library ايجاد مي كنيم و نام آن را WcfTest قرار مي دهيم نام كلاس را Calculate_Salary مي گذاريم و البته توجه داشته باشيد كه در هنگام تغيير نام دادن كلاس ويژوال استديو در يك Message Box از ما سوال مي كند كه تمامي Reference ها را دوباره نامگذاري كند كه آن را تاييد مي كنيم و در نهايت كدي به شكل زير خواهيم داشت :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WcfTest
{
public class Calculate_Salary
{
}
}
خوب براي اينكه اين كلاس را به يك سرويس WCF تبديل كنيم مي بايست چندين Attribute به آن اضافه كنيم .در اينجا با اين Attribute ها به CLR اعلام مي كنيم كه اين يك WCF سرويس است و در همچنين نشان مي دهيم كه WSDL مربوط به اين سرويس چگونه شكل بگيرد .
ابتدا بايد بدانيم اين Attribute ها در فضاي نامي System.ServiceModel قرار دارند .
ServiceContractAttribute
اين Attribute را بر روي كلاس ها و اينترفيس ها مي توانيم به كار بگيريم و البته قابل توجه است كه اين قAttribute ها قابل ارث بري نيستند .
namespace WcfTestService
{
[ServiceContract()]
public class CalculateSalary
{
}
در اينجا با اضافه شدن اين Attribute سرويس ما ساخته مي شود .
OperationContractAttribute
حالا نوبت به اضافه كردن متدهاي مورد نياز مي باشد فرض كنيم يك متد به نام calculate داريم كه ساعت كاري و ميزان حقوق به ازاي هر ساعت را گرفته و حقوق كلي را محاسبه مي نمايد :
public int calculate(int hour, int salary_per_hour)
{
return hour * salary_per_hour;
حال براي اينكه اين متد توسط سرويس به كلاينت نشان داده شود مي بايست Attribute فوق را به آن اضافه نماييم :
[ServiceContract()]
public class CalculateSalary
{
public int calculate(int hour, int salary_per_hour)
{
return hour * salary_per_hour;
}
در حقيقت سرويس ما با يك متد آماده شده است و تنها چيزي كه به اون نياز دازيم اينكه اين سرويس را در يك Host
قرار دهيم و چون فعلا در ابتداي كار هستيم يك Host
ساده مثل Console Application
را انتخاب مي كنيم بدين ترتيب كه يك پروژه از نوع Console Application
به Solution
اضافه مي كنيم و در تابع Main
آن كد زير را كه در حقيقت وظيفه Host شدن سرويس ما را به عهده دارد اضافه مي كنيم :
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(WcfTest.Class1)))
{
host.Open();
Console.WriteLine("WcfTest Service is servicing now!...\nPress any key to exit");
Console.ReadKey(true);
host.Close();
}
و همچنين در اين Console Application يك Application Configuration File به نام App.config به پروژه اضافه كنيم و تگ هاي XML زير را در آن قرار دهيم فعلا كاري نداريم كه اين تگ ها چيستند بعدا متوجه خواهيم شد :
کد HTML:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="NewBinding0" />
</basicHttpBinding>
</bindings>
<services>
<service name="WcfTest.Calculate_Salary" behaviorConfiguration="serviceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/service" />
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="NewBinding0" contract="WcfTest.Calculate_Salary" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[LEFT][RIGHT]</configuration>[/RIGHT][/LEFT][RIGHT][/RIGHT]
حال مي بايست Console Application را پروژه اصلي قرار داده و F5 را فشار دهيم . در زمانيكه برنامه در حال اجراست مي توانيم صفحه Browser خود را باز كرده و آدرس زير را كه در App.config به آن اشاره كرده ايم بنويسيم تا بتوانيم صفحه مربوط به سرويس را ببينيم .
دقت كنيد كه 8000 شماره port ميباشد كه سرويس دهي روي آن انجام مي شود و با قرار دادن ?wsdl در آخر اين Url مي توانيم صفحه WSDL اين سرويس را مشاهده نماييم .
حال اگر به WSDL ايجاد شده خوب دقت كنيم متوجه خواهيم شد كه دو Attribute مذكور چگونه كار خود را انجام داده اند :
ServiceContractAttribute
کد HTML:
<wsdl:service name="Calculate_Salary">
− <wsdl:port name="BasicHttpBinding_Calculate_Salary" binding="tns:BasicHttpBinding_Calculate_Salary">
<soap:address location="http://localhost:8000/service"/>
</wsdl:port>
[LEFT][RIGHT]</wsdl:service>[/RIGHT][/LEFT][RIGHT][/RIGHT]
و OperationContractAttribute
کد HTML:
<wsdl:operation name="calculate">
<soap:operation soapAction="http://tempuri.org/Calculate_Salary/calculate" style="document"/>
− <wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
− <wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
[LEFT][RIGHT]</wsdl:operation>[/RIGHT][/LEFT][RIGHT][/RIGHT]
اينWSDL Documentداراي اهميت بالايي است چون كلاينت هاي شما صرف از زبان مربوطه :Java,C# ,C++و ...همگي از روي WSDL متدهاي سرويس شما را صدا مي زنند .من سعي كردم بسيار بسيار خلاصه گويم و در بحث بعدي به نحوه استفاده از سرويس توسط كلاينت خواهيم پرداخت.