View Full Version : آموزش: آموزش WCF به زبان ساده
pooria2c
چهارشنبه 21 فروردین 1392, 12:43 عصر
سلام دوستان یه سری آموزشی WCF به زبان ساده رو واستون می خوام آماده کنم که انشا الله توی 8 یا 9 قسمت تموم میشه.
اگر هم سوالی بود توی این (http://barnamenevis.org/showthread.php?392588-%D9%BE%D8%A7%D8%B3%D8%AE-%DA%AF%D9%88%DB%8C%DB%8C-%D8%A8%D9%87-%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%28%D8%A2%D9%85%D9%88%D8%B2%D8%B4-WCF-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87%29&p=1740914#post1740914) تاپیک مطرح بفرمایید.
انشا الله مفید واقع بشه.
P2C
pooria2c
چهارشنبه 21 فروردین 1392, 12:49 عصر
در این قسمت می خوام درباره ABC، چیزی که توی سرویس ها متداوله توضیح مختصری بدم.
یک سرویس همیشه حداقل یه نقطه پایانی (Endpoint) داره (یعنی می تونه چند تا هم داشته باشه).
یک سرویس گیرنده (Client) فقط با یکی از این نقاط پایانی در هر لحظه می تواند ارتباط برقرار کند. در وب سرویس های قدیمی یک نقطه پایانی وجود داشت که از طریق HTTP و یا Text/XML می توانستیم با آن ها ارتباط برقرار کنیم. تصویر را نگاه کنید.
102594
با توجه به تصویر بالا هر نقطه پایانی از سه قسمت تشکیل شده است.
1) Address
2) Binding
3) Contract
پس مقصود ABC دقیقاً همین 3 کلمه است یعنی (Address، Binding،Contract)
حالا معنی این کلمات چی هستند و برای چی توی سرویس ها استفاده میشن؟؟؟!!
1) Address(آدرس)
هر وبسایت و یا وب سرویسی یه آدرس دارند مثل http://domain-name.com/ و یا http://domain-name.com/myservice.asmx.
سرویس WCF هم باید یک آدرس داشته باشد. WCF می تواند آدرس ها را برای پروتکل های زیر فراهم کند.
1) HTTP
2) TCP
3) NamedPipe
4) Peer2Peer
5) MSMQ
2) Binding(انقیاد)
یک Binding تعیین می کند که یک سرویس چگونه در دسترس باشد. فکر کنید پروتکل انتقال، encoding، و پروتکل های WS-* شبیه انتقال پیام های مطمئن )همان WSDL، SOAP) .
3) Contract (قرار داد)
Contract چیزیه که کاملاً بوسیله خودتون مشخص میشه. به زبان ساده Contract چیزی هست برای بیان آنچه سرویس شما انجام میدهد. به عنوان مثال: زمانی که شما کد پستی رو میدید، با استفاده از کد پستی آدرس کوچه و محله و خیابان و ... در میاد. (در توضیحات بعدی بیشتر توضیح می دم).
mona11
چهارشنبه 21 فروردین 1392, 12:58 عصر
میشه یه مثالی بزنید،که با وب سرویس دات نت 2 (asmx ) نشه انجام داد ولی wcf کار رو راه بندازه؟
pooria2c
چهارشنبه 21 فروردین 1392, 13:18 عصر
همان طور که در پست قبلی دیدید، ما به Address ، Binding و Contract برای کامل کردن چرخه ABC در WCF نیاز داریم.
ابتدا به بررسی Contract می پردازیم.
یک Contract به صورت صریح از طریق یک کلاس تعیین می شود. شما بوسیله اضافه کردن ویژگی (Attribute)، [ServiceContract] به یک کلاس و همچنین اضافه کردن ویژگی [OperationContract] به متدها می توانید از طریق سرویس ها به کلاس و متدهای آن کلاس دسترسی پیدا کنید.
[ServiceContract]
public class Hello
{
[OperationContract]
string HelloWorld()
{
return "Hello world";
}
string HelloComputer()
{
return "Hello computer";
}
}
در یک سرویس اصولی عملگرها به صورت صریح تعریف می شود. در مثال بالا تابع HelloComputer() توسط کسی که دارد از سرویس ما استفاده می کند قابل روییت نمی باشد، زیرا با هیچ ویژگی علامتگذاری نشده است. ولی تابع HelloWorld() قابل روییت می باشد، حتی باوجود اینکه این تابع به صورت Private می باشد.
Iterfaces (اینترفیس ها)
برای تولید یک Contract از اینترفیس ها استفاده کنیم و در نهایت آن انترفیس را برای کلاس خودمان Implement کنیم، علت این کار هم این است :
1) یک اینترفیس می تواند توسعه پیدا کند و یا اینکه از سایر Interface ها ارثبری کند.
2) یک کلاس واحد می تواند از چندید Interface ارثبری کند.
3) شما به راحتی می توانید اجرای یک سرویس را تغییر دهید بدون اینکه Contract نقض شود.
4) شما می توانید براحتی برای سرویس های خودتان با توجه به Interface های جدید و یا قدیم ورژن (نسخه) تعیین کنید.
در اینترفیس ها هم مانند کلاس ها باید از همان روش بالا برای کلاس ها استفاده نمایید.
[ServiceContract]
public interface IHello
{
[OperationContract]
string HelloWorld();
string HelloComputer();
}
public class Hello : IHello
{
string IHello.HelloWorld()
{
return "Hello world";
}
string IHello.HelloComputer()
{
return "Hello computer";
}
}
pooria2c
چهارشنبه 21 فروردین 1392, 13:28 عصر
میشه یه مثالی بزنید،که با وب سرویس دات نت 2 (asmx ) نشه انجام داد ولی wcf کار رو راه بندازه؟
سلام دوست عزیز لطفاً سوالات خودتون رو در این (http://barnamenevis.org/showthread.php?392588-%D9%BE%D8%A7%D8%B3%D8%AE-%DA%AF%D9%88%DB%8C%DB%8C-%D8%A8%D9%87-%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%28%D8%A2%D9%85%D9%88%D8%B2%D8%B4-WCF-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87%29&p=1740914#post1740914) تاپیک مطرح کنید، پاسخ شما رو در این (http://barnamenevis.org/showthread.php?392588-%D9%BE%D8%A7%D8%B3%D8%AE-%DA%AF%D9%88%DB%8C%DB%8C-%D8%A8%D9%87-%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%28%D8%A2%D9%85%D9%88%D8%B2%D8%B4-WCF-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87%29&p=1740914#post1740914) تاپیک دادم (این تاپیک مخصوص سوالات می باشد).
pooria2c
چهارشنبه 21 فروردین 1392, 15:03 عصر
ما برای میزبانی (استفاده کردن از سرویس) نیاز به یک شی از کلاس ServiceHost داریم. این کلاس اینترفیس IDisposable رو اجرا (Implement) می کنه، بنابراین ما از دستور برای این کار استفاده می کنیم.
using (ServiceHost host = new ServiceHost(xxx))
{
}
در این قطعه کد قسمتی که با xxx مشخص شده است در واقع پارامتر خودمان را تعیین می کنیم. (که نوع سرویس ما می باشد) در مثال ما Hello Contract. در مرحله بعد نیاز داریم که host ی را که ایجاد کردیم را باز کنیم. قبل از اینکه بوسیله WCF استفاده بشه.
Type type = typeof(Hello);
using (ServiceHost host = new ServiceHost(type))
{
host.Open();
Console.WriteLine("The service is available. Press any key to continue...");
Console.ReadKey();
host.Close();
}
توضیح قطعه کد :
در قطعه کد بالا اول از همه متغیر type تعریف شده که نوع کلاسی که به عنوان Contract تعیین شده است را به آن از طریق تابع سازنده معرفی می کنیم، بعد از اون host خودمون رو با دستور host.Open() باز میکنیم و عملیات خودمان را انجام می دهیم، که در این مثال با نشان داده یک پیام مبنی بر اینکه سرویس شما فعال است بر روی مانیتور نشان می دهیم.
و در نهایت host خودمان را با دستور host.Close() می بندیم.
دقت داشته باشید که هر برنامه ای که می نویسیم نیاز به یکسری پیکربندی دارد، پیکربندی WCF ما به همان سه حرف (کلمه) ABC مربوط می شود.
برای اینکه پیکربندی خودمان را شروع کنیم مراحل زیر را دنبال کنید :
1) app.config به پروژه خودتون اضافه کنید (بر روی پروژه کلیک راست کنید، بر روی گزینه Add New Item یک فایل Application Configuration File به پروژه خودتون اضافه کنید).
2) بر روی فایل app.config کلیک راست کنید و گزینه "Edit WCF Configuration" کلیک کنید. (در صورتی که این گزینه را مشاهده نمی کنید از منوی Tools بر روی گزینه WCF Service Configuration Editor کلیک نمایید و سپس مجدداً بر روی app.config کلیک راست نمایید.(
3) در صفحه ای که باز می شود می توان پیکربندی WCF پروژه خودمون رو به سادگی انجام بدیم (ABC)
4) در قسمت سمت راست یعنی Services بر روی گزینه "Create a New Service" کلیک نمایید، با کلیک بر روی این گزینه یک صفحه ویزاد دیگری برای شما باز می شود که در این قسمت باید تعیین که ما می خواهیم از چه سرویسی در ابتدا استفاده کنیم.
5) بر روی دکمه Browse… کلیک کنید و فایل قابل اجرای خودتون (پروژتون) رو انتخاب کنید (یعنی همون فایل .exe که در پوشه bin پروژه قرار داره). بعد از اینکه فایل قابل اجرای خودتون رو انتخاب کردید، کلاسی رو که از توابع Contract استفاده می کند یعنی همان کلاس Hello را انتخاب نمایید (دقت کنید که نام کلاس به همراه namespace پروژه می آید)، بعد دکمه Next را بزنید.
6) در مرحله بعدی Contract اصلی یعنی IHello رو باید تعیین کنید. (البته در اینجا خود ویزاد این کار رو برای ما انجام داده).
7) در قسمت بعدی باید پروتکلی که استفاده میشه رو انتخاب کنید. (در اینجا فعلاً با تنظیمات پیش فرض جلو می رویم و بر روی دکمه Next کلیک می کنیم).
8) در صفحه بعدی روش اتصال را باید تعیین کنید که همان گزینه پیش فرض یعنی Basic… رو انتخاب می کنیم.
9) و در مرحله آخر هم آدرس سرویس خودمون رو تعیین می کنیم، که در اینجا ما از آدرس http://localhost:8080/HelloService/ استفاده می کنیم، و بر روی دکمه Next کلیک می کنیم.
10) در مرحله آخر یک overview از تنظیماتی رو که انجام دادید رو مشاهده می کنید، بر روی دکمه Finish کلیک کنید.
حالا دکمه Ctrl + S (و یا از منوی File گزینه Save را انتخاب کنید) را فشار دهید تا تنظیمات ذخیره شوند.
اکنون فایل App.config شما باید به صورت زیر باشد :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfSample.Hello">
<endpoint
address="http://localhost:8080/HelloService/"
binding="basicHttpBinding"
contract=" WcfSample.IHello"
bindingConfiguration="" />
</service>
</services>
</system.serviceModel>
</configuration>
همانطور که مشاهده با انجام تنظیمات بالا در واقع ما ABC را تنظیم کردیم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.