# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WCF , Web Services , .Net Remoting > حرفه ای: آموزش ساخت وب سرویس و اتصال به آن در سی شارپ

## hadi.nahavandi

*مقدمه*


یکی از روش های ارتباط بین نرم افزار ها استفاده از وب سرویس های Soap می باشد. در این مقاله ساخت یک وب سرویس soap با استفاده از روش WCF در محیط دات نت ، نصب آن روی سرور های IIS ویندوز  و همچنین استفاده از آن به صورت همزمان و ناهمزمان در محیط دات نت با استفاده از یک پروژه نمونه توضیح داده می شود.
*پروژه نمونه*


در این مقاله ما سعی داریم یک وب سرویس برای یک شرکت ارایه دهنده بلیط قطارهای مسافربری بسازیم بتوان از طربق آن یک بلیط برای یک مسافر رزرو کرد ، و همچنین  با وارد کردن شماره قطار ظرفیت آن قطار ، اطلاعات مسافرین و تعداد مسافرین آن قطار را دریافت کرد.
ساخت پروژه جدید برای وب سرویس در محیط ویژوال استودیو 2015
در محیط دات نت وب سرویس ها را می توان به صورت یک پروژه مستقل ایجاد نمود ، می توان آن را به صورت یک کتابخانه به Solution مورد نظر اضافه نمود و یا اینکه به طور مستقیم آن را به پروژه اضافه نمود.در این مقاله ما به  ایجاد وب سرویس به صورت یک پروژه مستقل می پردازیم.
*ایجاد پروژه WCF Service Application*


برای ایجاد یک پروژه WCF Service Application  می بایست قدم های زیر را انجام دهید:
1-    نرم افزار  ویژوال استودیو 2015 را اجرا کنید.
2-    دکمه های Ctrl+Shift+N را فشار دهید تا صفحه ساخت پروژه جدید نمایش داده شود(شکل 1).
3-    از سمت چپ  از  بخش سی شارپ روی گزینه WCF کلیک کنید.
4-    گزینه Service Application  WCF  را انتخاب کنید.
5-    در بخش Name  نام پروژه مورد نظر خود را وارد کنید.(ما در اینجا نام آن را TrainTicket می گذاریم)



شکل 1: ساخت یک پروژه WCF Service Application در ویژوال استودیو 2015
*ساختار پروژه  WCF Service Application*


پس از تایید ، ویژوال استودیو یک پروژه جدید به همراه یک وب سرویس نمونه با نام Service1  را ایجاد خواهد کرد. هر وب سرویس در این روش دارای دو فایل می باشد: 1- یک Interface  با نام I[ServiceName] (منظور از ServiceName نام وب سرویس ما است) و یک فایل با نام [ServiceName].svc  که خود شامل فایل [ServiceName].cs و فایل تنظیمات وب سرویس می باشد.
عنوان و نوع پارامتر های ورودی و خروجی هر وب سرویس و همچنین ساختار انواع پیچیده مورد استفاده در آن(complex types) می بایست در فایل interface  آن تایین شود.البته انواع پیچیده را می توان در فایل های مجزا نیز معرفی نمود. انواع پیچیده و ساخت آن ها در بخش های بعدی این مقاله توضیح داده خواهد شد.
واضح است که برای اجرای وب سرویس می بایست یک کلاس interface  آن را پیاده سازی(Implement) نماید.آن کلاس در فایل [ServiceName].cs قرار می گیرد.


*ساختار فایل Interface  وب سرویس های WCF*


در شکل 2 Interface وب سرویس نمونه ای که می خواهیم بنویسیم نمایش داده شده است، در ادامه به توضیح کد آن می پردازیم.



شکل 2: ساختار فایلInterface  یک وب سرویس
 Interface  وب سرویس از دو فضای نام زیر استفاده می کند:
1-    System.ServiceModel
2-    System.Runtime.Serialization
عبارت های معرفی عملیات وب سرویس در فضای نام  System.ServiceModel و عبارت های معرفی داده های وب سرویس در فضای نام  System.Runtime.Serialization تعریف شده اند.
برای مشخص کردن کردن اینکه Interface نوشته شده interface یک وب سرویس می باشد می بایست قبل از تعریف آن عبارت [ServiceContract]  را قرار داد.
در اینجا نام وب سرویس ما Service1  می باشد ، همانطور که توضیح داده شد نام Interface آن باید IService1 باشد.
وب سرویس ما دارای چهار متد می باشد:
1-    متد Reserve که کد قطار و اطلاعات مسافر را دریافت نموده و نتیجه رزرو را به صورت یک بله یا خیر بر می گرداند.
2-    متد GetCapacity که کد قطار را دریافت نموده و ظرفیت قطار را بر می گرداند.
3-    متد GetPassengers که قطار را دریافت نموده و لیست اطلاعات مسافران را برمی گرداند.
4-    متد GetPassengerCount که قطار را دریافت نموده و تعداد مسافران موجود آن را بر می گرداند.
همانطور که در شکل 2 مشاهده می کنید قبل از تعریف هر متدی که توسط وب سرویس ارایه می شود باید عبارت [OperationContract]  را قرار دهید.
همانطور که مشاهده می کنید خروجی متد سوم از انواع داده اولیه نمی باشد و می بایست آن را تعریف کنیم.به دلیل اینکه این کلاس باید در Client های استفاده کننده از این وب سرویس نیز ساخته شود می بایست تعریف آن را به همراه مشخصات عمومی آن با عبارت های مخصوصی مشخص نماییم. همانند کلاس های دیگر زبان سی شارپ می توانیم برای تعریف هر کلاس فایل مستقلی ایجاد کنیم و یا اینکه تعریف کلاس را در یک فایل موجود انجام دهیم. در  اینجا تعریف کلاس را در همان فایل Interface انجام می دهیم.
همانطور که در شکل 2 مشاهده می کنید برای مشخص کردن کلاس مورد استفاده در وب سرویس می بایست قبل از تعریف آن عبارت [DataContract] را قرار دهید.
قبل از هر مشخصه عمومی کلاس نیز باید عبارت [DataMember] را قرار دهید.در مواردی مانند مثال بالا که مشخصات به صورت خصوصی(private) باشند می بایست عبارت یاد شده را قبل از متد های Accessor آن ها قرار دهید. 


*ساختار فایل پیاده سازی وب سرویس*


پیاده سازی وب سرویس در فایلی که نام آن در قالب [ServiceName].cs می باشد و در پروژه نرم افزار وب سرویس می تواند با باز کردن فایل [ServiceName].svc  انجام می شود. این کلاس یک کلاس معمولی سی شارپ می باشد و  فایل Interface وب سرویس را پیاده سازی می نماید. چون عملیات و داده های عمومی وب سرویس را در فایل Interface مشخص نموده ایم ، دیگر نیازی به مشخص کردن متد ها با عبارت های مخصوص تعریف وب سرویس نمی باشد.
در شکل 3 یک مثال برای پیاده سازی وب سرویس بلیط قطار ارایه شده است. در اینجا برای پیچیده تر نشدن کد در متد ها  ذخیره و دریافت گزارش را از Database  انجام نمی دهیم.

شکل 3: نمونه کد پیاده سازی وب سرویس

* اجرای  وب سرویس*


برای آغاز به کار وب سرویس ، پروژه خود را اجرا نمایید.پس از اجرا مشابه شکل 4 صفحه تست کردن وب سرویس نمایش داده می شود. می توانید آدرس وب سرویس خود را در این صفحه مشاهده نمایید. با وارد کردن آدرس وب سرویس در مرورگر اینترنت ، صفحه ای مانند شکل 5 نمایش داده می شود.



شکل 4: کلاینت تست وب سرویس


شکل 5 : نمونه صفحه وب سرویس در مرورگر اینترنت

با اضافه کردن عبارت ?wsdl به لینک وب سرویس می توانید فایل wsdl وب سرویس را مشاهده نمایید که مانند شکل 6 می باشد.

شکل 6 : نمونه فایلWSDL  وب سرویس

*استفاده از وب سرویس در سی شارپ*


همانطور که اشاره شد وب سرویس های نوشته شده به روش soap فارغ از اینکه وب سرویس در چه محیط و یا زبان برنامه نویسی نوشته شده اند در زبان ها و محیط های برنامه نویسی مختلفی قابل دسترسی می باشند. در اینجا ما به نوشتن یک Client برای وب سرویسی که برای بلیط قطار نوشتیم می پردازیم در محیط ویژوال استودیو 2015 و در زبان سی شارپ می پردازیم. نوشتن کد Client در زبان های دیگر نیز به روش مشابه انجام می گیرد با این تفاوت که محیط ویژوال استودیو می تواند بیشتر کد مورد نیاز را تولید می کند و برنامه نویس فقط نیاز به استفاده از کد تولید شده دارد.
استفاده از وب سرویس به دو روش همزمان و غیر همزمان انجام می گیرد که در اینجا به هردو روش به صورت مجزا می پردازیم.


*استفاده از وب سرویس به صورت همزمان*


در اینجا می خواهیم از وب سرویس نوشته شده برای بلیط قطار به صورت همزمان استفاده کنیم. همانطور که می دانید در این روش نرم افزار پس از ارسال درخواست به وب سرویس می بایست برای ادامه کار منتظر دریافت پاسخ از وب سرویس بماند و ارتباط بین وب سرویس و Client تا زمان دریافت پاسخ قطع نمی شود.
همانطور که می دانید می توانیم از وب سرویس در انواع نرم افزار ها استفاده کنیم. به طور مثال ما در اینجا یک پروژه ویندوز فرم می سازیم و می خواهیم از وب سرویس در آن استفاده نماییم.
برای استفاده از وب سرویس از مسیر زیر وارد صفحه اضافه کردن ارجاع وب سرویس می شویم.
Project>Add Service Reference
در شکل 7 این صفحه نمایش داده شده است.
در این صفحه در بخش آدرس ، آدرس وب سرویس مورد نظر را وارد نمایید و با کلیک رو دکمه Go ویژوال استودیو تلاش می کند  که متدهای وب سرویس را تشخیص دهد.این کار را باید زمانی انجام دهید که وب سرویسی که آدرس آن را وارد می کنید در حال اجرا باشد.
حال در بخش Namespace نام فضای نامی که می خواهید در نرم افزارتان از طریق آن به وب سرویس دسترسی پیدا کنید را وارد کنیدبا کلیک روی دکمه OK  ، ویژوال استودیو کد مورد نیاز برای دسترسی به وب سرویس وارد شده را تولید خواهد کرد. کدهای تولید شده را می توانید در بخش Service References پروژه تان مشاهده نمایید.
حال برای دسترسی به وب سرویس می بایست یک شی پراکسی از وب سرویس بسازید.پراکسی در سی شارپ به صورت یک کلاس با نام [ServiceReferenceNamespace].[ServiceName]Client ساخته می شود. متد های موجود در پراکسی مشابه متد های وب سرویس می باشند با این تفاوت که ویژوال استودیو در پیاده سازی متدهای پراکسی به جای کد آن متد کد ارسال و دریافت اطلاعات به متد هم نام از آن وب سرویس را قرار می دهد(شکل 8) . به طور مثال برای نوشتن کد دریافت تعداد مسافران قطار شماره 14 می توانیم کدی مانند شکل 9 را بنویسیم.



شکل 7 : صفحه افزودن ارجاع به وب سرویس


شکل 8 : نمونه کد پراکسی ساخته شده در کلاینت وب سرویس

شکل 9 : نمونه کد دریافت ظرفیت قطار شماره 14

*استفاده از وب سرویس به صورت Async*


همانطور که اشاره شد اتصال به وب سرویس به صورت همزمان دارای معایب زیادی می باشد و در بسیاری از موارد باعث فشار به سرور می شود همچنین در بسیاری از فرایند ها ممکن است دریافت پاسخ از وب سرویس مدت زیادی طول بکشد و به همین دلیل برنامه می بایست زمان زیاد منتظر بماند. به همین دلیل در این به استفاده غیر همزمان از وب سرویس می پردازیم.
در روش غیر همزمان نرم افزار در زمان فراخوانی پراکسی یک متد به صورت ورودی به آن می دهد که پس از دریافت پاسخ از وب سرویس آن متد اجرا خواهد شد. در این روش نرم افزار می توانید بدون منتظر ماندن به فعالیت خود را ادامه می دهد
برای استفاده از وب سرویس به صورت غیر همزمان صفحه افزودن ارجاع وب سرویس را بازکنید(شکل 7)  حال پس از وارد کردن آدرس، بررسی و وارد کردن فضای نام ارجاع روی دکمه Advanced  کلیک کنید و در صفحه باز شده(شکل 10) گزینه Generate Asynchronous Operations  را انتخاب نمایید.پس از تایید ویژوال استودیو کد های لازم برای ارتباط با وب سرویس به صورت غیر همزمان را تولید خواهد کرد.
در شکل 11 نمونه کد دریافت ظرفیت قطار شماره 14 ارایه شده است. در ویژوال استودیو برای هر متد وب سرویس یک شنونده یا EventHandler با نام [OperatinName]Completed ساخته می شود و باید یک شنونده به آن اضافه کنیم. همانطور که می دانید در سی شارپ در زمان ساخت EventHandler می بایست یک متد استاتیک با دو ورودی از نوع object  و EventArgs به عنوان ورودی به آن بدهیم. در اینجا ورودی متد را از نوع [OperatinName]CompletedEventArgs قرار می دهیم که خود از EventHandler  ارث برده است.
همانطور که مشاهده می کنید با استفاده از مشخصه Result این پارامتر ورودی متد می توانیم به خروجی وب سرویس دسترسی پیدا کنیم.
واضح است که مشخصه Result کلاس [OperatinName]CompletedEventArgs هم نوع خروجی متد وب سرویس مورد نظر است که در این مثال از نوع عدد است.




شکل 10 : صفحه تنظیمات  پیشرفته افزودن ارجاع به وب سرویس

شکل 11 : نمونه کد ارتباط غیرهمزمان با وب سرویس

منبع: http://sweetsoft.ir

----------


## رامین مرادی

ممنون بابت آموزش جامع و مفیدتون. کاش راهاندازی این سرویس در iis رو هم یاد بدید. من تو نت سرچ کردم و رفتم اما تو بروزر نمیتونم باز کنم.

----------

