# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WCF , Web Services , .Net Remoting >  مقدمه ای بر WSDL

## xamfia

در ادامه بحث مقدماتی که درباره سرویس های وب داشتم در این پست به سراغ WSDL می رویم .
یکی از سوالاتی که در پست قبلی مطرح کردم این بود که چگونه می توان برای استفاده از یک سرویس از چگونگی کنش و واکنش های آن آگاهی پیدا کرد؟؟
به عبارتی دیگر زمانی که شما می خواهید متد خاصی را فراخوانی کنید باید بدانید چه پارامترهایی از چه نوعی دریافت می کند و همچنین مقدار برگشتی اش چه می باشد؟ و یا شاید اصلا بخواهید توضیحاتی در مورد اینکه یک متد چکار خاصی را برای شما انجام میدهد را بدانید و ... راه چاره WSDL است.
WSDL(web service description language) همان طور که از نامش پیداست زبان و استانداردی برای تشریح یک سرویس است.
@ این زبان با فرمت XML است و برای تشریح یک وب سرویس که چگونه فراخوانی می شود و چه پارامترهایی می گیرد، استفاده می شود. WSDL از پنج قسمت به شرح زیر تشکیل شده است : 
1) بخش <types> : در این بخش تمام گونه های داده ای که توسط سرویس مورد استفاده قرار می گیرد، تعریف می شود.
2) بخش <message>: پارامترهای ورودی و خروجی سرویس در این بخش تعریف می شوند.
3) بخش<portType>: روشهای دسترسی به پیغامهایی که در بخش پیش تعریف شده اند در این بخش قرار می گیرند. [این تگ از مهترین اجزا WSDL میباشد. در واقع این تگ نقش دروازه ورود به یک سرویس را بازی میکند.همان طور که شاید تا به حال حدس زده باشید در سرویس ها ما چیزی شبیه تابع Main در برنامه های قدیمی نداریم.در واقع این تگ برای ما تقریبا همان نقش را بازی میکند، یعنی به ما میگوید که از کجا شروع کنیم] 
4) بخش<bindings>: پروتکلهایی که مورد استفاده قرار می گیرد (HTTP GET, HTTP POST, SOAP) در این بخش قرار می گیرد.
5) بخش<service> : تمام بخشهای ذکر شده تا اینجا، در این قسمت به هم متصل می شوند.

( از@ تا اینجا از نوشته های مجید اطلس باف نیز بهره گرفته ام- قابل توجه کسانی که اخلاق علمی را رعایت نمی کنند!!) 

ترجیح میدهم به جای تعاریف قلمبه سلمبه(!) که معمولا ما برنامه نویسان از آن متنفریم ، برویم به سراغ یک مثال سادهاز سایت آموزشی W3C در آدرس http://www.w3schools.com/webservices/tempconvert.asmx

در این مثال ما یک کلاس با کد زیر داریم :<%@ WebService Language="VBScript" Class="TempConvert" %>
Imports System
Imports System.Web.Services
Public Class TempConvert :Inherits WebService
<WebMethod()> Public Function FahrenheitToCelsius
(ByVal Fahrenheit As String) As String
dim fahr
fahr=trim(replace(Fahrenheit,",","."))
if fahr="" or IsNumeric(fahr)=false then return "Error"
return ((((fahr) - 32) / 9) * 5) 
end function
<WebMethod()> Public Function CelsiusToFahrenheit
(ByVal Celsius As String) As String
dim cel
cel=trim(replace(Celsius,",","."))
if cel="" or IsNumeric(cel)=false then return "Error"
return ((((cel) * 9) / 5) + 32)
end function
end classفعلا نیازی به تفسیر کد بالا نیست پس خودتان را زیاد درگیر درک آن نکنید (در پست های آینده به تفسیر در مورد کد نویسی webservice بحث خواهم کرد) فقط در همین حد بدانید که این کلاس دو متد دارد برای تبدیل فارنهایت به سلسیوس و بلعکس.
در آدرس زیر می توانید این دو تابع را تست کنید و لذت ببرید!
http://www.w3schools.com/webservices/tempconvert.asmx
حال به سراغ بحث خودمان پیرامون WSDL برمیگردیم ، اگر شما سری به آدرس زیر بزنید میتوانید WSDL مربوط به کلاس بالا را مشاهده کنید:
http://www.w3schools.com/webservices/tempconvert.asmx?wsdl
جالب بود نه؟!!<s:element name="*FahrenheitToCelsius*">
<s:complexType>
<s:sequence>
@
<s:element minOccurs="*0*" maxOccurs="*1*" name="*Fahrenheit*" type="*s:string*" /> 
</s:sequence>
</s:complexType>
</s:element>
@@
<s:element name="*FahrenheitToCelsiusResponse*">
<s:complexType>
<s:sequence>
<s:element minOccurs="*0*" maxOccurs="*1*" name="*FahrenheitToCelsiusResult*" type="*s:string*" /> 
</s:sequence>
</s:complexType>
</s:element> 
احتمالا در همین برخورد اول شما خودتان به رابطه های بسیاری برخوردید و شاید متوجه شده اید که WSDL چگونه می تواند با تگ های خود ویژگی های یک متد را ار قبیل تعداد و نوع پارامتر های ورودی ،نوع برگشتی تابع، توضیحات اضافی هر تابع و ... را شرح دهد. 
در خط @ به بعد شما پارامتر ورودی تابع را ملاحظه میفرمائید که نامش *Fahrenheit*است و نوع آن نیز String می باشد.
در خط @@ به بعد WSDL شرح مقدار برگشتی متد *FahrenheitToCelsius*را به ما می دهد که ناگفته پیداست که مقدار برگشتی متد(تابع) از نوع String می باشد. 

در شکل بالا می توانید نمای کلی فرایند یک WSDL را ببینید و با چگونگی عملکرد کلی آشناتر شوید.
برای اطلاعات بیشتر میتوانید ار لینک زیر استفاده کنید 
http://www.w3.org/TR/wsdl20 

با تشکر 
میثم نوایی 

http://www.xamfia.com/about.aspx

----------


## amin_alexi

سلام
ممنون از توضیحاتی که در مورد این بحث دارید میدید (و ان شاء الله که ادامه دار باشه)
این پیشنهاد رو واسه منسجم کردن تاپیک میگم
اگه ممکنه تمام بحث رو در یک تاپیک به صورت ادامه دار دنبال کنید ... (*مقدمه ای بر سرویس های وب*)
تا دوستان بتونند به راحتی تمام بحث رو دنبال کنند ...
در ضمن از تک Code برای نوشتن Code استفاده کنید (رو Icon ها علامت # رو کلیک کنید) تا خوانایی بالا بره !  :چشمک: 
ممنون

----------


## milad_mhb

سلام ممنون از مقالتون.من يه منبع كامل و جامع مي خوام در مورد WSDL اگه لينك خوبي دارين ممنون ميشم بذارين اگه فارسي باشه بهتره .بازم ممنون

----------


## xamfia

قصد دارم در اولین فرصت که سرم خلوت شد یک مقاله جامع در مورد WSDL درج کنم اما فعلا می توانید از لینک های زیر کمک بگیرید.
http://www.w3schools.com/WSDL/default.asp
http://www.ibm.com/developerworks/library/ws-intwsdl/

----------


## xamfia

متاسفانه مدت زیادی وقت نکردم این پست را بروزرسانی کنم اما در این بخش قصد دارم در مورد برخی از تگ های مهم WSDL کمی توضیح دهم:

<?xml version="1.0" encoding="utf-8" ?> 
این تگ همان معرفxml است که برای ایجاد هر سند xml لازم و ضروری است و شامل ورژن و انکودینگ xml میباشد
*-* <wsdl:definitions xmlns:soap="*http://schemas.xmlsoap.org/wsdl/soap/*" xmlns:tm="*http://microsoft.com/wsdl/mime/textMatching/*" xmlns:soapenc="*http://schemas.xmlsoap.org/soap/encoding/*" xmlns:mime="*http://schemas.xmlsoap.org/wsdl/mime/*" xmlns:tns="*http://tempuri.org/*" xmlns:s="*http://www.w3.org/2001/XMLSchema*" xmlns:soap12="*http://schemas.xmlsoap.org/wsdl/soap12/*" xmlns:http="*http://schemas.xmlsoap.org/wsdl/http/*" targetNamespace="*http://tempuri.org/*" xmlns:wsdl="*http://schemas.xmlsoap.org/wsdl/*">
 

اولین تگ رسمی WSDL محسوب میشود و در واقع باقی تگ ها و بدنه WSDL در این تگ قرار میگیرد همچنین namespace ها نیز در این بخش معرفی میشوند.
*-* <wsdl:types>
*-* <s:schema elementFormDefault="*qualified*" targetNamespace="*http://tempuri.org/*">
*-* <s:element name="*HelloWorld*">
<s:complexType /> 
 
</s:element>
 
 
*-* <s:element name="*HelloWorldResponse*">
*-* <s:complexType>
.
.
.
 
 

توصیف کننده شمای مورد استفاده در سرویس شما میباشد و در واقع در تگ بعدی <s:shema/> ما فرمت تمامی آیتم های به کار رفته شده در بدنه WSDL را شرح و بسط میدهیم.و اگر دقت کنید میتوانید متوجه شوید که تک تک عناصر شما در این بخش تعریف شما میشوند.(در این بخش دو فاکتور همیشه خودنمایی میکنند minoccurs و maxoccurs که بیان میکنند که عنصر مورد نظر تنها و تنها یکبار بار در سند ظاهر میشود و احتمالا فهمیده اید که تعاریف نوع دادهای چگونه در این بخش انجام میگیرد به طور مثال s:string و s:int و...)
با کمی دقت در این بخش به عنصری شبیه 
<s:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
نیز برخورد خواهید کرد که وضعیت نوع برگشتی را شرح میدهد و در واقع متوجه شدید که ما هم به توصیف درخواست Message ها می پردازیم و هم به توصیف پاسخ های آنان.
در روزهای آینده در مورد باقی تگ های WSDL از جمله 
<wsdl:message...
<wsdl:portType…
<wsdl:binding…
<wsdl:service…

توضیحاتی خواهم داد.

----------

