آموزش گام به گام ساختن و بکارگیری یک سرویس WCF با استفاده از ویژوال استودیو ۲۰۱۰
آموزش گام به گام ساختن و بکارگیری یک سرویس WCF با استفاده از ویژوال استودیو ۲۰۱۰
در این نوشتار، میخواهم چگونگی ایجاد یک سرویس WCF و بکارگرفتن آن را نشان دهم. (برای نمایش بزرگتر تصاویر، روی آنها کلیک کنید)
مایکروسافت برای پشتیبانی از معماری سرویسگرا (service oriented)، مدل برنامهنویسی یکپارچه WCF (Windows Communication Foundation) را فراهم کرد. ASMX نسخهی پیشین از مایکروسافت بود که بر پایه XML و فریمورک .NET بوده و وبسرویسهای ASMX را پشتیبانی میکند.
مدل WCFبه توسعهدهندگان این امکان را میدهد تا راهکارهایی امن با قابلیت اطمینان و برپایهی تراکنش تولید کنند که قابلیت استفاده بر روی پلتفرمهای مختلف را داشته باشند. با استفاده از WCF شما میتوانید دادهها را بصورت ناهمگام (asynchronous) از یک endpoint به endpoint دیگری ارسال کنید.
از مهمترین مزیتهای WCF اجماع مزایای کلیه روشهای پیادهسازی سیستمهای توزیع شده در یک غالب واحد و منعطف است. قبل از ارائه WCF، بسته به شرایط موجود بین کلاینت و سرور، معمولاً استفاده از یکی از روشهای توسعه توزیعشده مناسبتر بوده و انتخاب میشده است. به عنوان مثال در صورتی که استفاده کننده از سرویس، روی پلتفرم .net پیادهسازی شده باشد و همچنین در داخل سازمان قرار داشته باشد، استفاده از .net Remoting بهترین راه حل موجود بوده است، حال اگر همین سرویس میبایست قابلیت دسترسی از خارج از سازمان یا از سایر پلتفرمها (مانند J2EE) را میداشت، استفاده از WebService به عنوان راه حل دیگری مطرح میشد، یا در حالتی دیگر سرویس میبایست به هر دو صورت در اختیار قرار میگرفت که پیچیدگی فراوان و نگهداری پرهزینهای را در بر داشت.
برای بیشتر خواندن دربارهی WCF اینجا کلیک کنید.
همسنجی وبسرویسهای .NET با WCF |
|
ASMX Web Services |
WCF |
Can be hosted in ISS only |
Multiple Hosting Options as IIS, WAS, Console, WinNT Service, WCF Provided Host |
Support for HTTP only |
Support for HTTP, TCP, MSMQ, NamedPipes |
Limited Security |
A Consistent Security Programming Model |
Uses XmlSerializer |
Uses DataContractSerializer |
گرچه WCF یک گام بزرگ برای آینده است، اما ویژوال استودیو؛ ایجاد، انتشار و بکارگیری سرویسهای WCF را آسانتر میکند.
در اینجا میخواهم سرویسی به نام SayHello با ۲ پارامتر به نامهای name و language را بسازم. پارامتر name برای ورودی گرفتن نام اشخاص و پارامتر language برای گرفتن زبان مورد استفاده در ورودی است. این سرویس نام کاربر را گرفته و با توجه به زبان وارد شده، به کابر سلام میکند.
برای مثال هنگامی که کاربر مقدار “آرمان” برای پارامتر اول و مقدار “fa” را برای پارامتر دوم وارد کند، خروجی بصورت “سلام آرمان” نمایش داده میشود. و یا اگر مقدار “denis” برای پارامتر اول و مقدار “en” را برای پارامتر دوم وارد کند، خروجی “Hello denis” نمایش داده میشود.
آغاز کار:
نخست ویژوال استودیو ۲۰۱۰ را اجرا کرده و پس از آن از منوی File و زیرمنوی New، روی Project کلیک کنید. از پنجرهی باز شده و از سمت چپ Visual C# و زیر دستهی WCF را انتخاب کرده و سپس از قسمت میانی پنجره WCF service application را انتخاب کرده و نامی برای سرویس خود برگزینید که در اینجا من نام HelloService را بکار بردم.
ویژوال استودیو همهی فایلهای لازم را برای شروع کار میسازد. بصورت پیشفرض سرویس نام Service1.svc و رابط IService.csرا دارد. شکل زیر نمایی از پنچره Solution Explorer پروژهی ایجاد شده است:
در اینجا به این دو پیشفرض نیاز نداریم، یا باید حذف کنیم و یا برای ادامهی کار، این دو را ویرایش کنیم. من در اینجا هر دو را با کلیک راست کردن روی هر کدام، حذف (Delete) میکنم.
حال این پروژه برای سرویسدهی آماده نیست، پس برای ساختن سرویس از پنچره Solution Explorer روی نام پروژه (HelloService) کلیک راست کرده، Add را انتخاب و سپس روی New Item کلیک میکنیم.
در پنجرهی باز شده WCF service را انتخاب کرده و نام HelloService.svc را وارد کرده و روی دکمهی Add کلیک میکنیم.
حالا ویژوال استودیو دو فایل با نامهای IHelloService.cs و HelloService.svc ساخته است. این فایلها در واقع برای تعریف سرویس (IHelloService.cs) و اجرای سرویس (HelloService.svc) هستند.
اجازه دهید که در اینجا رابط IHelloService را بررسی کنیم، شکل زیر مربوط به محتویات IHelloService است:
کدهای موجود در IHelloService برای تعریف سرویس و فراهمکنندههای اپریشن/متد با نام DoWork() است (شبیه به وبمتد در وبسرویسهای ASMX). هر سرویس WCF، فایل رابطی را دارد که سرویس را تعریف میکند.
و حالا اجازه دهید که فایل HelloService.svc را بررسی کنیم که شکل زیر مربوط به آن است:
کد نشان داده شده برای اجرای رابط IHelloService است. که این کد خود-توضیحی (self-explanatory) است؛ کلاس HelloService نیاز به اجرای همهی متدهای مشخص شده در تعریفات سرویس را دارد.
IHelloService.cs را در محیط ویژوال استودیو با کلیک کردن بر روی نام آن باز کنید و متد DoWork() را حذف کرده و یک تعریف برای SayHello() ایجاد کنید. اضافه کردن OperationContract به متد را فراموش نکنید. کدهای لازم برای این کار به شکل زیر میباشد:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace HelloService { [ServiceContract] public interface IHelloService { [OperationContract] string SayHello(String name, String language); } }
حالا برای پیادهسازی متد SayHello فایل HelloService.svc.cs را ویرایش کرده و کدهای زیر بنویسید:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace HelloService { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "HelloService" in code, svc and config file together. public class HelloService : IHelloService { public string SayHello(String name, String language) { switch (language) { case "en": return "Hello " + name; case "fa": return "سلام " + name; default: return "زبان پشتیبانی نشده"; } } } }
ما موفق به ساخت این سرویس شدهایم.
حالا برای اجرای این سرویس میتوان کلید F5 را از صفحهکلید فشار داده و یا از منوی Debug روی گزینهی start debugging کلیک کنید.
اگر همهی مراحل بالا را به درستی انجام داده باشید؛ ویژوال استودیو میزبانی سرویس شما را برای یک کلاینت و تست کردن آن انجام میدهد. و شکل زیر نمایش داده میشود:
در قسمت چپ این پنجره، سرویسهای در دسترس نمایش داده میشود و در سمت راست، سرویسها را میتوان آزمایش کرد. برای آزمایش کردن سرویس sayHello روی نام آن دوبار کلیک کنید. برای پارامترهای name و language مقداری وارد کنید و روی دکمهی Invoke کلیک کنید. مثالی از ورودیها و گرفتن خروجی از سرویس را در تصویر زیر میبینید:
ما این سرویسدهنده را ایجاد کردهایم و درستی آن را نیز بررسی کردیم. در گام بعدی سرویسگیرنده را مینویسیم.
ایجاد یک سرویسگیرنده دو مرحله دارد.
یکی ساخت کلاس و دیگری ساخت فایل پیکربندی مربوط به سرویس است. نخست من میخواهم این فایل کلاس و پیکربندی را تولید کنم.
برای این کار، به همراه ویژوال استودیو یک ابزار عالی به نام svcutil.exe در درسترس است. این ابزار کلاس لازم و فایل پیکربندی را برای شما تولید میکند. اگر اطلاعات بیشتری در مورد این ابزار نیاز دارید، اینجا کلیک کنید.
برای استفاده از این ابزار باید Visual studio command prompt را اجرا کنید. این محیط را از مسیر برنامه موجو در استارتمنوی ویندوزتان پیدا کنید(Start Menu -> All Programs -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio command prompt) که جای آن در شکل زیر مشخص شده است:
مطمئن شوید که سرویستان در ویژوال استودیو در حال اجرا است. برای ادامهی کار نیاز به url سرویس خود دارید (که میتوانید آن را در پنجرهی سرویس در حال اجرا و با کلیک راست کردن بر روی url سرویس در قسمت چپ پنجره بدست بیاورید) حالا در محیط خط فرمان باز شده توسط فرمان svcutil.exe هر دو فایل را بسازید، دستور
svcutil.exe http://localhost:4949/HelloService.svc /d:d:\temp
را وارد کرده و کلید اینتر را بزنید. شکل زیر تصویر اجرای این دستور است.
توضیحی برای سوئیچ /d در این دستور لازم است. با استفاده از این سوییچ، مسیری را برای ذخیره دو فایل ایجاد شده مشخص میکنیم (در اینجا مسیر d:\temp استفاده شده است). توجه کنید که محیط خط فرمان با دسترسی مدیر سیستم (run as administrator) اجرا شده باشد.
با این کار، این ابزار دو فایل با نامهای HelloService.cs و output.config برای ما در مسیر مشخص شده میسازد.
در مرحلهی بعدی باید پروژهی جدیدی بسازیم و فایلهای ساخته شده و سرویس را در آن بکار گیریم. من برای اینکار در ویژوال استودیو و در قسمت solution explorer بر روی نام Solution کلیک راست کرده و گزینه Add و سپس New Project را کلیک میکنم.
در پنجرهی باز شده Visual C# را کلیک کرده و در قسمت میانی Console Application را انتخاب و سپس نامی برای آن وارد کنید. من در اینجا نام TestService را وارد کردم.
حالا به مسیری بروید که توسط ابزار svcutil.exe دو فایل را ساخته شده است (d:\temp). فایل output.config را به app.config تغییر نام بدهید.
در مرحلهی بعدی این دو فایل را (d:\temp\helloservice.cs و d:\temp\app.config) را باید به پروژه اضافه کنیم. در ویژوال استودیو و در قسمت Solution Explorerروی نام پروژه (TestService) کلیک راست کرده گزینه Add و سپس Existing Item را کلیک کنید.
در پنجره باز شده به مسیر ذخیره شده دو فایل رفته و آنها انتخاب کرده و روی دکمهی Add کلیک کنید. (مانند تصویر زیر)
حالا نیاز به اضافه کردن یک reference با نام System.ServiceModel به پروژه داریم. برای این کار در قسمت Solution Explorer و در پروژهی TestService و بر روی References کلیک راست کرده و گزینهی Add Reference را کلیک کنید. در پنجرهی باز شده و به تب .Net رفته و System.ServiceModel را انتخاب کرده و روی دکمهی Ok کلیک کنید. (مانند تصویر زیر)
حالا در پروژهی TestService و با دوبار کلیک روی Program.cs کدهای مربوط به آنرا مانند تصویر زیر تغییر دهید تا بتوان از وب سرویس و متد اصلی استفاده کرد.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestService { class Program { static void Main(string[] args) { //نمایش پیغام نام را وارد کنید Console.Write("Enter your name: "); //خواندن نام وارد شده توسط کاربر و قرار دادن در متغیر string name = Console.ReadLine(); //نمایش پیغام زبان را وارد کنید Console.Write("Enter your language: "); //خواندن زبان وارد شده توسط کاربر و قراردادن در متغیر string lang = Console.ReadLine(); //ساختن آبجکت سرویس گیرنده HelloServiceClient c = new HelloServiceClient(); // فراخوانی سرویس Console.WriteLine(c.SayHello(name, lang)); Console.ReadLine(); } } }
پیش از اجرا کردن پروژه، روی نام پروژه (TestService) کلیک راست کرده و گزینهی Set as Startup Project را کلیک کنید. نمونهای از خروجی برنامه را در زیر میبینید:
در این نوشتار شما گام به گام ساختن و بکارگرفتن یک سرویس WCF را مشاهده کردید.
حال که بیایید بصورت خلاصه با ABC در سرویس WCF آشنا شویم:
سرویس WCF، نقاط پایانی را ارائه میدهد که توسط شبکه و با استفاده از پروتکلهای انتقالی، کاربرها از خدمات ارائه شده توسط سرویس، استفاده کنند. برای این منظور با سه اصطلاح Address، Bindingو Contract سر و کار داریم که به اختصار از آن به عنوان ABC در مبحث WCF یاد میشود.
- A=Address: سرویس در کجا دسترسپذیر است (هر وبسایت یا وبسرویس آدرسی دارد، WCF میتواند آدرسها را برای پروتکلهای HTTP، TCP، NamedPipe، Peer2Peer و MSMQ فراهم کند).
- B=Binding: چه کسی مجوز دسترسی داشته باشد (مشخص کردن چگونگی استفاده پروتکلهای انتقال و پروتکلهای امنیتی و …)
- C=Contract: چگونگی انجام کارهای سرویس (هر رابط Contract را تعریف میکند، به زبان سادهتر Contract چیزیست که خودتان در سرویس انجام داده و مشخص کردهاید).
با توجه به این توضیحات، محتویات فایل app.config درون پروژهی خودتان را مرور کرده و endpoint خودتان را تحیل کنید.
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IHelloService" /> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:4949/HelloService.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHelloService" contract="IHelloService" name="WSHttpBinding_IHelloService"> <identity> <dns value="localhost" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>
در شکل زیر WCF’s ABC با بیانی ساده و خلاصه به تصویر کشیده شده است.
در صورت نیاز به دریافت فایل این آموزش و کدهای مربوط به آن از لینک زیر استفاده کنید، از طریق این لینک و به اشتراکگذاشتن، لینک دانلود فایل pdf این آموزش و سورسکد در دسترس قرار میگیرد.
۹ comments
دیدگاهتان را بنویسید لغو پاسخ
Calendar
ش | ی | د | س | چ | پ | ج |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
ازت خیلی ممنونم
مرسی از زحمتت
خیلی ممنون واقعا خوب بود کاش میشد یه برنامه دیگه و بزرگتر رو با wcf اموزش میدادید تا بهتر و بیشتر بتونیم یاد بگیریمش
از نظر شما سپاسگزارم. برنامهی شخصی من این بود که اینکار رو ادامه بدم که متاسفانه هنوز امکانپذیر نشده
عالی بود
مرسی. خیلی خوب و ساده و قابل فهم بود.
فوق العاده بود ممنونم
ممنون، عالی بود.
با سپاااس برای شروع عالی و کامل بود