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

## مهدی رحیم زاده

به نام خدا
خوشحالم که مسئولیت این کار رو به عهده بنده حقیر گذاشتن و بنده رو قابل دونستن . امیدوارم که بتونم اون اندازه که می تونم تلاش کنم و یک سری مطالب جامع و کامل رو برای استفاده اساتید محترم سایت برنانه نویس اینجا بزارم . 

موارد قابل ذکر :

    * به دلیل اینکه آموزش به صورت متن می باشد، طبیعتا سرعت آن نسبت به کلاس های حضوری کمتر خواهد بود. چون مجبور خواهم بود که علاوه بر ترجمه منابع مختلف، جهت جمع آوری یک مطلب، عکس های مربوطه را نیز با نرم افزار های مربوطه ایجاد و چنانچه مبحث دارای کد برنامه هم باشد، آن ها را هم مهیا کنم. پس خواهشا صبر به خرج دهید و انتظار تکمیل شدن این آموزش را در چندین روز نداشته باشید. چون این مبحث جدیده و منابع فارسی برای آن وجود نداره.. انشاء الله بتوان یک منبع خوب فارسی در این زمینه پس از این آموزش داشته باشیم


    * به دلیل برنامه ریزی هایی که انجام شده، مطالب به صورت سلسله وار و از مباحث مبتدی شروع میشه و به تدریج مباحث پیشترفته تدریس خواهند شد. چون این جا یک مکان عمومی است و هر برنامه نویسی با هر سطحی ممکن است، وجود داشته باشد. پس دوستانی که بر مباحث ابتدایی اشراف دارند، می توانند این تاپیک را در زمانی که به مباحث پیشترفته تر رسید، دنبال کنند.


    * دوستانی که قصد همکاری در آموزش را دارند، مطالب خود را یا با پیغام خصوصی و یا با ایمیل من که در امضای من موجوده، به دست من برسانند، تا در زمان معین آن را در تاپیک قرار دهم. پس خواهشا از قرار دادن لینک ها و نکته های مختلف و متعدد در این تاپیک خود داری کنید و آن ها را در صورت لزوم در تاپیک نکات که در اعلانات این بخش قرار داره، قرار دهید. این به این دلیل است که می خواهم مطالب به صورت سلسله وار بیان شوند و از هرج و مرج در تاپیک جلوگیری شود.


    * هر گونه، سوال و جواب، بحث و گفتگو در رابطه با مفاهیمی که در این تاپیک مطرح می شود، خود داری کنید و آن ها را در تاپیکی جداگانه مطرح نمایید.


هر گونه کپی برداری از مطالب این تاپیک با ذکر کامل منبع توصیه می شود

با تشکر .
لطف کنید و به صورت خصوصی جواب بدین .

----------


## مهدی رحیم زاده

Windows Comunication Foundation ( WCF ) ، مدل برنامه نویسی یکپارچه Microsoft ، برای شناخت نرم افزارهای سرویس گرا ( Service-Oriented ) می باشد که ارتباط بین تمام برنامه های کاربردی را به وسیله یک مدل برنامه نویسی جدید Service-Oriented ، ساده تر توسعه می دهدو برای توسعه دهندگان امکاناتی زیبا فراهم می کندتا برای توسعه سرویس ها ، راه کار هایی امن ، قابل اطمینان ، منعطف و مبتنی بر تراکنش را تولید نمایند که می توانند بین Platformهای مختلف استفاده شوند و قابلیت اتصال و استفاده از سرمایه گذاری های فعلی سازمانها را دارند تا یک دیدگاه برای اداره محاسبات توزیع شده ، ارتباطات وسیع بین سیستمها طراحی گردد و مسیری مستقیم برای جهت دهی سرویس ها ارائه کند . 
WCF یک SDK Software Development Kit))  برای توسعه و گسترش سرویس های Windows است ، یک محیط Runtime برای سرویس های شما فراهم می کند و به شما این امکان را می دهد که CLR Typeها را به عنوان سرویس هایی نمایش داده و برای استفاده سایر سرویس ها به عنوان CLR Typeها ارائه کنید . 
سیستمی که از WCF استفاده می کند می تواند پارامتر های امنیتی و یا مرتبط با بازدهی خود را با توجه به محل فیزیکی استقرار استفاده کنندگان از وب سرویس تنظیم کند . WCF بدون ایجاد سربار و پیچیدگی مدیریت این امکان را فراهم می کند که به عنوان مثال تقاضاهایی که منجر به ایجاد یک تراکنش می شوند ، تنها از داخل سازمان مطرح شوند و کاربران خارج سازمانی یا کاربرانی که از Platformهای متفاوت از سرویس ها  استفاده می کنند ، با اشکال متفاوت اعمال و ضوابط امنیتی رو به رو نشوند . WCF کلیه روش های پیاده سازی سیستم های توزیع شده را در یک غالب واحد و منعطف فراهم می کند که از مهمترین مزیت های آن است . 
قبل از ارائه WCF، بسته به شرایط موجود بین کلاینت و سرور، معمولاً استفاده از یکی از روش های توسعه توزیع شده مناسب تر بوده و انتخاب می شده است. به عنوان مثال در صورتی که استفاده کننده از سرویس، روی پلتفرم .net پیاده سازی شده باشد و همچنین در داخل سازمان قرار داشته باشد، استفاده از .net Remoting بهترین راه حل موجود بوده است، حال اگر همین سرویس می بایست قابلیت دسترسی از خارج از سازمان یا از سایر پلتفرم ها (مانند J2EE) را می داشت، استفاده از WebService به عنوان راه حل دیگری مطرح می شد، یا در حالتی دیگر سرویس می بایست به هر دو صورت در اختیار قرار می گرفت که پیچیدگی فراوان و نگهداری پرهزینه ای را در بر داشت.
WCF با پشتیبانی از تمامی تکنولوژی های موجود، و در عین حال استقلال از تمامی پروتکل های ارتباطی، امکانات زیر را در اختیار توسعه دهندگان سیستم های توزیع شده می گذارد:
•	به دلیل اینکه WCF امکان ارتباط از طریق Webservice را دارا می باشد، ارتباط دوطرفه با سایر پلتفرم ها از قبیل application server های اصلی J2EE امکانپذیر خواهد بود.
•	WCF می تواند به گونه ای تنظیم یا گسترش داده شود که با سایر وب سرویس ها توسط پیغام هایی که مبتنی بر SOAP نیستند ارتباط برقرار کند، همانند ساختار های ساده XML مثل RSS .
•	برای رسیدن به بهترین سطح بازدهی در مواقعی که هر دو طرف ارتباط(سرویس دهنده و سرویس گیرنده) از WCF استفاده می کنند، encoding ارتباطی در این حالت یک نسخه بهینه سازی شده باینری از XML Information Set است. پیغام ها هنوز از ساختار داده SOAP تبعیت می کنند در حالی که encoding آنها از فرم باینری داده استفاده می کند تا از فرم تگ دار XML 1.0. با استفاده از این امکان می توان با پیاده سازی یک سرویس، هم قابلیت ارتباط با سایر پلتفرم ها را داشت و هم در ارتباط با پلتفرم های مشابه (مبتنی بر WCF) ، از بازدهی بسیار نزدیک به .NET Remoting بهره مند شد.
•	مدیریت طول عمر objectها، تعریف تراکنش های توزیع شده و سایر جنبه های Enterprise Services در داخل WCF گنجانده شده اند (قبلاً می بایست از Microsoft Enterprise Services در داخل سرویس دهنده استفاده می شد.)
•	به دلیل پشتیبانی WCF از تعداد کثیری از استاندارد های WS-*، امنیت، قابلیت اطمینان و تراکنش با هر پلتفرم دیگری که از این استاندارد ها تبعیت می کند می تواند وجود داشته باشد.
•	نتیجه این تجمع قابلیت ها، قدرت بیشتر و کاهش شدید پیچیدگی می باشد.

ارتباط دوطرفه با سایر پلتفرم های Webservice
•	برنامه ای که برپایه WCF ایجاد شده باشد با تمامی اقلام زیر می تواند ارتباط داشته باشد:
•	نرم افزار های مبتنی بر WCF که در حال اجرا بر روی processهای مجزا بر روی همان سیستم مبتنی بر ویندوز هستند.
•	نرم افزارهای مبتنی بر WCF که بر روی یک سیستم مجزای مبتنی بر ویندوز قرار دارند.
•	نرم افزار هایی که بر روی سایر تکنولوژی ها تشکیل شده اند. مانند J2EE که از وب سرویس های استاندارد پشتیبانی می کند. این نرم افزارها می توانند بر روی ماشین هایی با سیستم عامل ویندوز، و یا سایر سیستم هامل ها باشند.
•	برای ممکن ساختن چیزی فراتر از یک ارتباط ساده، WCF تکنولوژی های وب سرویسی را که در استاندارد های WS-* تعریف شده اند پیاده سازی می کند. این استاندارد ها پاسخگوی مسائل مختلفی هستند، از جمله سیستم پایه ای انتقال پیام، امنیت، قابلیت اطمینان، تراکنید و کارکردن با metadata های سایر وب سرویس ها. به تفکیک عملکرد این استانداردها، موارد زیر پوشش داده شده است:
•	Messaging: Soap زیربنای وب سرویس ها است و یک پوشش اصلی را برای گنجانده شدن هدر و بدنه اصلی تعریف می کند. WS-Addressing ضمائمی را به هدر SOAP اضافه می کند تا آدرس دهی پیغام های SOAP بدون وابستگی به پروتکل transport مورد استفاده، مانند HTTP، برای حمل اطلاعات آدرس دهی، صورت پذیرد. Message Transmission Optimization Mechanism (MTOM) معرف یک فرمت بهینه سازی شده برای ارسال پیغام های SOAP ی که حاوی محتویات باینری حجیم هستند می باشد.
•	Metadata: زبان توصیف وب سرویس (WSDL)، زبانی استاندارد برای مشخص کردن وب سرویس و جنبه های مختفی از استفاده های ممکن از آن است. WS-Policy این امکان مشخص کردن جنبه های پویاتری از وب سرویس را فراهم می کند که توصیف آنها در WSDL امکانپذیر نیست، مانند حالت امنیتی که ترجیح داده می شود. WS-MetadataExchange این امکان را می دهد تا کلاینت ها بطور مستقیم درخواست اطلاعات دقیقی را ، مانند WSDL و یا policy وب سرویس، بنمایند (به کمک SOAP).
•	امنیت: WS-Security، WS-SecureConversation، WS-Trust و WS-Federation تمامی بخش هایی را به SOAP اضافه می کنند تا authontication، data integrity، امنیت اطلاعات و سایر مشخصه ها فراهم شود.
•	قابلیت اطمینان: WS-Reliable Messaging قسمتهایی را به هدر SOAP اضافه می کند که اجازه ارتباط مطمئن end to end را حتی اگر یک یا چند سرویس واسط وجود داشته باشند، می دهد.
•	تراکنش‌ها: بر پایه WS-Coordination، WS-Atomic Transaction امکان هماهنگ کردن تراکنش ها با دوفاز commit را در غالب وب سرویس فراهم می کند.
•	به نظر نمی رسد که با استفاده از WCF بخشی از معماری سرویس گرا وجود داشته باشد، که پاسخی برای آن یافت نشود.

منابع مورد استفاده :
https://barnamenevis.org/438360-post4.html
What Is Windows Communication Foundation?
//---------------------------------------------------------
Programming WCF Services
Juval Lowy
//----------------------------------------------
Professional
WCF Programming
.NET Development with the Windows®
Communication Foundation
Scott Klein
//----------------------------------------------
Pro WCF
Practical Microsoft SOA
Implementation
Chris Peiris, Dennis Mulder, Shawn Cicoria,Amit Bahree, Nishith Pathak

----------


## مهدی رحیم زاده

مقدمه ای بر معماری سرویس گرا ( SOA )  :
*اشاره :*
در چهار دهه اخیر ، پیچیدگی نرم افزارها روز بروز بیشتر شده و تقاضا برای نرم افزارهای قدرتمندتر افزایش یافته است. در این میان ، به نظر می رسد که روشهای قدیمی جوابگوی نیازهای در حال رشد کنونی نیستند و نیاز به ایجاد و بکارگیری روشهایی است که بوسیله آنها بتوان بر این پیچیدگیها در زمانهایی کوتاهتر غلبه کرد. از طرفی امكان كنار گذاشتن سیستمهای نرم افزاری موجود که تا به حال مشغول سرویس دهی به مشتریان بوده اند ، وجود ندارد و می بایست سیستمهای جدید را بصورت یکپارچه و در کنار همین سیستمها بوجود آورد. معماری سرویس گرا ، با تکیه بر محاسبات توزیع شده و بر پایه شبکه ها و لایه های میانی و همچنین زبانهایی که تولید نرم افزارهای توزیع شده را فراهم می كنند ، بعنوان راه حلی مناسب جهت از میان برداشتن مشکلات و مسائل مذكور مطرح گردیده است. در این مقاله ضمن معرفی این معماری به محاسبات سرویس گرا و نیازهای آن پرداخته و معماری سرویس گرای توسعه یافته به عنوان راه حلی برای رفع این نیازها ارائه می شود.

معرفی
تعاریف گوناگونی از معماری سرویس گرا ارائه شده است كه از جمله آنها می توان به تعاریف زیر اشاره كرد:
مجموعه قوانین ، سیاستها و چهارچوبهایی كه نرم افزارها را قادر می سازد تا عملكرد خود را از طریق مجموعه سرویسهای مجزا و در عین حال مربوط به هم در اختیار سایر درخواست كنندگان قرار دهند تا بتوانند بدون اطلاع از نحوه پیاده سازی و تنها از طریق رابطهای استاندارد و تعریف شده ، این سرویسها را پیدا كرده و فراخوانی نمایند.و یا معماری سرویس گرا روشی برای ساخت سیستمهای توزیع شده ای است که در آنها عملکرد سیستم بصورت سرویس در اختیار کاربران و یا سایر سرویسها قرار می گیرد.
از دیگرتعاریف ارائه شده می توان به "واحدهای نرم افزاری آماده در شبكه (Network-available Software Unit) " یا "سرویسهای سطح حرفه (Business-level services) " اشاره كرد.
در حال حاضر ، تکنولوژی سرویسهای وب(Web Services)  و پیاده سازی نمونه های موفق از آن، نشان داده است که SOA می تواند به عنوان راه حلی عملی و دست یافتنی در طراحی سیستمهای جدید و یکپارچه-سازی سیستمهای بزرگ موجود ، مطرح گردد. البته ذکر تفاوت سرویسهای وب و SOA در اینجا لازم به نظر می رسد.
سرویسهای وب  مجموعه ای از تکنولوژیهایی همچون XML,SOAP,WSDL و UDDI می باشد که امکان ارائه راه حل و برنامه نویسی جهت رفع مشکلی خاص را فراهم می نماید.
در حالی که SOA یک معماریست و از مجموعه مشخصی از تکنولوژیها فراتر می باشد. اگرچه SOA بر اساس این تکنولوژیها راه حل ارائه می نماید ، اما در عین حال مستقل از هر یک از آنها است.
آنچه اهمیت دارد تعریف سرویس به عنوان مهمترین عنصر این معماری می باشد.
سرویس ، رفتار قرادادی تعریف شده ایست که هر قطعه ای می تواند آنرا جهت استفاده سایر قطعات در سیستم تهیه و پیاده سازی نماید.
در این معماری ، همه توابع به عنوان سرویس تعریف می گردند. این توابع شامل توابع حرفه (Business functions)  و تراكنشهای حرفه‌ای (Business transactions)می باشند كه تراكنشهای حرفه خود شامل توابع سطح پایین (Low-level functions) و توابع سیستمی سرویسها(System service functions) هستند.
سرویسها بصورت مستقل طراحی و پیاده سازی شده و به عنوان جعبه سیاه عمل می نمایند. قطعات دیگر در خارج از این قطعه نیازی به دانستن نحوه انجام کار در این سرویس را ندارند و تنها به نتیجه آن نیازمندند.
قطعات، سرویسهای خود را از طریق رابطها (interface) در اختیار قطعات دیگر قرار میدهند که این رابطها قابل دستیابی و فراخوانی هستند، بدون اینکه محل قرار گیری آنها اهمیت داشته باشد (رابطهای محلی یا دور ) . در ضمن این رابطها می توانند به همان نرم افزار كاربردی  یا به آدرسی در محل دیگری از شبکه مرتبط باشند .
رابطها به عنوان کلیدی در برقراری این ارتباطها هستند و از طریق آنها نوع پارامترهای ورودی و نتایج (خروجی) مشخص می گردد.
بعلاوه ، با ایجاد قابلیت توزیع شدگی به شكلی مناسب و بدون وابستگی زیاد ، می توان سرویسها را در قسمتهای مختلف شبکه و بصورت بعضا تکراری ( مخصوصا برای سرویسهای مهم ) قرار داد تا این سرویسها همیشه در دسترس بوده و در صورت زیاد شدن درخواستها بتوان با استفاده از تکنیکهای Load Balancing به تمامی آنها به‌خوبی پاسخ داد.

ویژگیهای سرویس و محاسبات سرویس گرا
محاسبات سرویس گرا (SOC) ، نمونه ای از محاسبات است که در آن طراحی و توسعه سیستم های کاربردی بر پایه سرویس به عنوان عنصر اساسی ، انجام می گیرد. سرویس ها عناصری هستند که مستقل از پلتفرم بوده و در ساخت سیستمهای توزیع شده سریع و ارزان قیمت کمک می نمایند. همچنین سازمانها را قادر می- سازند تا توابع خود را از طریق زبانها و پروتکلهای بر پایه XML پیاده سازی و بر روی اینترنت یا اینترانت ارائه نمایند.
از آنجا که سرویسها از طریق سازمانها و شرکتهای گوناگون تهیه می شوند و جهت دسترسی كاربران مختلف می بایست همواره در دسترس باشند ، رعایت ویژگیهای زیر ضروری می باشد:

- مستقل از تکنولوژی باشند؛ به این معنا که بکارگیری و مکانیزم فراخوانی و پیدا کردن سرویسها به راحتی و از تمام محیطها ( سیستمهای عامل مختلف و زبانهای برنامه سازی گوناگون ) میسر بوده و وابسته به پلتفرم خاصی نباشد.

- وابستگی بسیار پایینی بین درخواست کننده و ارائه دهنده سرویس وجود داشته باشد و یا بعبارتی Loosly Coupled باشد. به این معنا که درخواست کننده نباید هیچ نیازی به دانستن ساختار داخلی و نحوه پیاده سازی سرویس داشته باشد. برای این منظور ، فراخوانی سرویس از طریق بکار گیری مکانیزم پیغام (Message) بجای فراخوانی API انجام می گردد.

- درخواست کننده نباید نیازی به دانستن محل قرارگیری سرویس داشته باشد و بعبارتی معماری سرویس گرا می بایست Location Transparency  را پشتیبانی نماید. به این ترتیب که محل قرارگیری سرویس و مشخصات آن در مخزنی (Repository) قرار می گیرد و درخواست کننده ، محل و اطلاعات لازم را از طریق بازیابی آن از این مخزن بدست می آورد.

سرویس ها می توانند به دو شکل ساده و ترکیبی ارائه شوند. سرویسهای ترکیبی ، سرویسهایی هستند که بر اساس بکارگیری چند سرویس ساده ( یا ترکیبی) ایجاد می شوند. برای مثال ، ممکن است سیستم توزیع شده ای  بر اساس چند سرویس ساده صدور صورتحساب ، ثبت سفارش ، مدیریت روابط مشتری و ... سرویسهای ترکیبی گسترده تری در ارتباط با حرفه ای خاص ایجاد نماید.
سیستمهای ساخته شده بر اساس سرویس ، ترکیبی از سرویسهای مستقل هستند که عملکردهای خود را از طریق رابطهای تعریف شده ای در اختیار کاربران (بالقوه ) خود  قرار میدهند.  (Web Service Description Language)WSDL از جمله راههایی است که بطور گسترده برای تعریف این رابطها بکار می رود تا بوسیله آن جزئیات لازم برای اتصال درخواست کننده به ارائه دهنده سرویس تعریف شود.

نرم افزار به‌عنوان سرویس
اصل ارائه شده " نرم افزار- بعنوان- سرویس" از محاسبات سرویس گرا ، بر اساس مدل ASP مطرح گشته است. ASP هویت سوم شخصیست که بكارگیری سرویسهای نرم افزاری و دسترسی مشتری را به بسته نرم افزاری از طریق شبكه، مدیریت و میزبانی می نماید.به‌عبارتی ASP ها راهی برای رفع نیازهای IT شرکتها از طریق واگذاری بخشی از این نیازها  یا تمامی آنها به بیرون از سازمان می باشند.
برای این منظور ASP با استفاده از زیر ساختهای خود ، ارتباط بین مشتری و نرم افزار ارائه شده را برقرار کرده و دسترسی وی به داده ها و توابع موجود را بصورت در دسترس (online)، مدیریت می نماید.
اگرچه نظریه "نرم افزار بعنوان سرویس" اولین بار توسط ASP ارائه شد ، اما مشكلات این روش باعث ایجاد کدهایی می شد که معمولا قابل استفاده مجدد نبوده و محدود به مشتری خاص می بود ، بعبارتی وابستگی زیادی بین سرویس ارائه شده و سیستم استفاده کننده بوجود می آمد.
معماری سرویس گرا اجازه میدهد تا نظریه "نرم افزار بعنوان سرویس"، گسترش یافته  تا از طریق آن بتوان پردازشها و تراکنشهای پیچیده را بعنوان سرویسهایی با قابلیت استفاده مجدد ارائه کرد و به این ترتیب سیستمها را مستقل از سرویسها طراحی و تولید نمود.

معماری سرویس گرای مقدماتی

SOA شیوه ای منطقی برای طراحی سیستمهای نرم افزاری است که از طریق آن سرویسهایی جهت ارائه به کاربران یا سایر سرویسهای توزیع شده بر روی شبکه ایجاد می شود و این سرویسها از طریق رابطهای تعریف شده در دسترس می باشند.
معماری سرویس گرای مقدماتی ، راهی برای تبادل اطلاعات بین عاملهای نرم افزاری بوسیله پیغام تعریف می نماید. این عاملها ، درخواست کننده سرویس (مشتری) و یا تهیه کننده سرویس می باشند. علاوه بر این دو، عامل دیگری بعنوان عامل کشف سرویس نیز وجود دارد. در معماری سرویس گرا معرفی سرویسها و همچنین نحوه ارتباط این سه شرکت کننده نیز اهمیت دارد. این ارتباطات عبارتند از : منتشر کردن سرویس ، پیدا کردن سرویس و متصل شدن به سرویس.

شکل 1 
در یک سناریو بر پایه سرویس ، تهیه کننده ، سرویس را پیاده سازی کرده و از طریق شبکه به ارائه توضیحات آن سرویس برای درخواست کننده یا عامل کشف سرویس می پردازد. در خواست کننده معمولا درخواست پیدا کردن سرویس را به عامل کشف سرویس میدهد تا از طریق آن به توضیحات ارائه شده سرویس و محل آن دسترسی پیدا کند. سپس با بکارگیری این اطلاعات به تهیه کننده سرویس متصل شده و از سرویس ارائه شده استفاده می نماید.
بدین ترتیب ، سرویس بعنوان قطعه نرم افزاری پیاده سازی شده ای که توسط یک رابط تعریف شده مستند گردیده است و نه تنها بوسیله خود تهیه کننده بلکه توسط سایر عواملی که از نحوه پیاده سازی آن خبر ندارند ، نیز قابل استفاده و فراخوانی است. این ویژگی جعبه سیاه بودن سرویس از اصل ماژولاریتی در مهندسی نرم افزار به ارث رسیده است. البته سرویس با تعاریفی مانند ماژول ، قطعه نرم افزاری یا شی تفاوت دارد ، زیرا نه تنها در سطح برنامه ها و نرم افزارهای کاربردی ، بلکه در سطح حرفه و حتی مابین سازمانها نیز قابل بكارگیری و استفاده مجدد می باشد.
در واقع سرویسها، نمایش عملکرد معنی داری از حرفه هستند که می توانند بنا به نیاز مشتری در سرویسها و توابع بزرگتر یا جدید بکار گرفته شوند.
رابطها به سادگی مکانیزمی جهت برقراری ارتباط بین سرویس و نرم افزارها یا سایر سرویسها ایجاد می نمایند. از لحاظ تکنیکی، رابط سرویسها ، توضیحاتی در مورد نام و امضاء متدهای یک سرویس هستند که توسط درخواست کننده ، قابل فراخوانی می باشند.

معماری سرویس گرای توسعه یافته
معماری سرویس گرای مقدماتی به برخی از مسائل موجود در یک معماری مبتنی بر سرویس نمی پردازد. از جمله این مسائل، مدیریت، هماهنگ سازی سرویسها ، متناسب کردن آنها ، امنیت ، مدیریت تراکنشها و ... می باشد.این نکات که در شکل 2 نمایش داده شده است ، در معماری سرویس گرای توسعه یافته در نظر گرفته شده است.

شکل 2 

معماری مقدماتی در لایه پایینی این معماری لایه ای قرار گرفته است. لایه ترکیب سرویس در معماری توسعه یافته ، شامل توابع و نقشهای لازم برای یکپارچه کردن چند سرویس بعنوان سرویس ترکیبی می باشد. سرویس ترکیبی بدست آمده ، توسط Service Aggregator بعنوان یک سرویس مقدماتی استفاده می گردد و یا توسط درخواست کنندگان سرویس بکارگرفته می شود.
Service Aggregator تهیه کننده سرویسی است که سرویسهای ارائه شده توسط سایر تهیه کنندگان را یکپارچه می نماید تا از آنها سرویسهای جدید بسازد، همچنین مشخصات و کدهایی را تهیه می کند تا در مورد سرویسهای ترکیبی عملیات زیر را انجام دهد:

- متناسب کردن : کنترل اجرای سرویسهای ترکیب شده و مدیریت گردش داده ها در بین آنها و انتقال آن به خروجی.

- کنترل کردن : مجوز دادن به رخدادها و اطلاعات تولید شده توسط سرویسهای ترکیبی جهت به اشتراک گذاشتن و منتشر کردن رخدادهای ترکیبی سطح بالاتر ( برای مثال از طریق فیلتر کردن و خلاصه سازی)

- مطابقت دادن : حصول اطمینان از حفظ جامعیت سرویسهای ترکیبی از طریق تطبیق دادن محدودیتها و نوع پارامترهای سرویسهای بکار رفته.

- ترکیب خواص سرویسها : بکارگیری ، مجتمع سازی و دسته بندی ویژگی های سرویسهای ترکیب شده جهت بدست آوردن خواص ترکیبی جدید که دربردارنده کارایی ، هزینه ، امنیت ، جامعیت ، قیاس پذیری ، در دسترس بودن و قابلیت اطمینان می باشد.

استانداردهای جدید ارائه شده با عنوان زبان اجرای پردازشهای حرفه برای سرویسهای وب ، تلاشی است که بر اساس XML ، تعریف سرویسهای وب جدید را که از ترکیب سرویسهای موجود بدست می آیند ، ارائه دهد.یک پردازش BPEL بصورت انتزاعی با ارجاع و اتصال به portTypeهای تعیین شده در WSDL ای ایجاد می شود كه در سرویسهای وب موجود در یک پردازش ، تعریف شده است.
مدیریت نرم افزارهای کاربردی مهم و بحرانی تجارت الکترونیک ، می بایست نظارت عمیق و جامعی در محیطهای توزیع شده داشته باشد. خارج از دسترس بودن یک عنصر کلیدی در سیستمهای توزیع شده، تاثیر منفی زیادی بر کل چرخه گذاشته و باعث بیرون رانده شدن ارائه کننده سرویس از بازار می شود.
برای رویارویی با چنین موقعیتهایی ، سازمانها نیاز به کنترل دائم سرویس و حصول اطمینان از سلامتی سیستم دارند. کارایی می بایست همیشه ، در هر شرایطی و با هر بار کاری ، در سطح قابل قبولی باشد.
برای مدیریت قسمتهای مهم و بحرانی و سرویسهای ویژه ، معماری توسعه یافته ، در لایه مدیریت سرویس بعنوان بالاترین سطح ، سرویسهای مدیریت شده را ارائه کرده است.
این لایه شامل دو قسمت مدیریت عملکرد و مدیریت بازار می باشد. کارکرد مدیریت عملکرد بدین صورت است که قسمتهای مهم سیستم را پشتیبانی می نماید. این لایه جزئیاتی از کارایی سیستم را جهت  ارزیابی آن ارائه میدهد و بدین صورت سازمان را قادر می سازد تا بر اساس وضعیت نرم افزار و تکمیل شدن تراکنشهای حرفه ، تصمیم گیری نماید. اپراتور سرویس ، مسئول انجام امور مربوط به این واحد است.
مدیریت عملکرد ، قابلیت بسیار مهم و کلیدی است که می تواند صحت و کارایی کلی سیستم را کنترل نماید و بدین ترتیب از بروز مشکلات شدید و خطا در سرویسها جلوگیری کند.
این خطاها ممکن است بر اثر اجتماع و هماهنگ سازی سرویسها و بخاطر عدم رعایت توافقهای در سطح سرویس (SLA) اتفاق بیافتد.
مدیریت و کنترلهای مناسب باعث کاهش احتمال بروز چنین خطاهایی می شود؛ بدین ترتیب که صحت ، پایداری و همچنین مناسب بودن ارتباط بین توابع بکار رفته در سرویسهای ورودی و خروجی را بررسی و کنترل می نماید.
قسمت دیگر در لایه مدیریت ، مدیریت بازار می باشد. مسئولیت این واحد ارائه پروتکلها و قوانین استاندارد در سطح حرفه می باشد تا از این طریق امکان استفاده از سرویسهای تعبیه شده در بازارهای مختلف بوجود آید.
در ضمن برخی از تسهیلات و سرویسهای پایه برای امور مالی ، تضمین کیفیت و ... در این لایه قرار می گیرد تا از این طریق بازارهای مختلف بتوانند در کمترین زمان به سرویسها دسترسی یابند.
این قسمت از لایه مدیریت ، توسط سازندگان بازار که کنسرسیومی از شرکتهای فعال در این عرصه هستند ، کنترل و نگهداری می گردد.
درنهایت ، با توجه به نكات مذكور می توان معماری سرویس گرا را روشی در جهت بهبود طراحی و استفاده از سیستمهای نرم افزاری دانست ، اگرچه مشكلات و چالشهای پیش روی آن همچنان نیازمند بررسی تجارب گذشته و نیز ارائه راه حل مناسب پیرامون مسائل مطرح در این معماری می باشند.
*منابع :*
http://www.ictna.ir/article/archives/000376.html
نوشته: سهیل توده فلاح

----------


## farzin.fz

من در شروع اين بحث ترجيحا مطالب قبلي را مد نظر نمي گيرم چون حس و حال خواندن آنها را نداشتم و نقطه ابتدايي خودم را پايه ريزي مي كنم و سعي مي كنم ساده بنويسم  و ضمنا چون اين مطالب را در حال حاضر مي نويسم احتمال اشتباه زياد است كه در صورت برخورد اطلاع دهيد . خوب ، بهتره در ابتدا يه نگاه ساده داشته باشيم به اينكه واقعا 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  زير را در آن قرار دهيم فعلا كاري نداريم كه اين تگ ها چيستند بعدا متوجه خواهيم شد : 

```
<?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  به آن اشاره كرده ايم بنويسيم تا بتوانيم صفحه مربوط به سرويس را ببينيم . http://localhost:8000/service دقت كنيد كه 8000 شماره port  ميباشد كه سرويس دهي روي آن انجام مي شود و با قرار دادن ?wsdl در آخر اين Url  مي توانيم صفحه WSDL اين سرويس را مشاهده نماييم . http://localhost:8000/service?wsdl حال اگر به WSDL ايجاد شده خوب دقت كنيم متوجه خواهيم شد كه دو Attribute  مذكور چگونه كار خود را انجام داده اند : ServiceContractAttribute

```
<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

```
<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 متدهاي سرويس شما را صدا مي زنند .من سعي كردم بسيار بسيار خلاصه گويم و در بحث بعدي به نحوه استفاده از سرويس توسط كلاينت خواهيم پرداخت.

----------


## Mrs.Net

لطفا ادامه بدهید
بیشتر منتظر جلسات بعد از مقدماتی هستم
و اگر مطالبی راجب انتقال آبجکت بجای STRING یا INT میدونید به اونها هم اشاره کنید.

----------


## farzin.fz

خوب ، بهتره بحث را پاسخ به سوال يكي ازاعضاء كه جزئي از مسير اصلي است ادامه دهيم .
لازم به ذكر است كه تمامي موارد جديد به پروژه قبلي اضافه مي گردند لذا مي بايست ابتدا اين پروژه را ايجاد نماييد .
بعضي اوقات ما نياز داريم به اينكه يه ‍نوع Complex  را حالا به هر دليل انتقال بدهيم و حال فرض مي كنيم اين نوع ما يك كلاس به نام Employee با تعريف زير مي باشد .

public class Employee
    {
        int _id;
        public Employee(int ID)
        {
            _id = ID;
        }        
        public int Identification
        {
            get
            {
                return _id;
            }
            set
            {
                if (value <= int.MaxValue)
                    _id = value;
            }
        }
    }
و فرض كنيم كه در سرويس متدي به شكل زير داريم :
[OperationContract()]
        public Employee getEmployee(int ID_number)
        {
            return new Employee(ID_number);
        }
چون قبلا اشاره كرده ايم كه هيچ رابطه اي بين كلاينت و سرويس از لحاظ باينري وجود ندارد پس مي بايست اين نوع خاص را در WSDLنشان دهيم . در دنياي XML  از XSD  براي اين منظور استفاده مي گردد و براي آساني كار يك Attribute  در نظر گرفته شده كا با قرار دادن آن در بالاي نوع مورد نظر آن را به XSD سرويس اضافه مي نماييم .
[DataContractAttiribute] 
اين Attribute در فضاي نامي System.runtime.Serialization قرار دارد چون در حقيقت كار آن Serialize  كردن مي باشد .
   [DataContract()]
    public class Employee
    {
        int _id;
        public Employee(int ID)
        {
            _id = ID;
        }        
        public int Identification
      {
            get
            {
                return _id;
            }
            set
            {
                if (value <= int.MaxValue)
                    _id = value;
            }
        }
    }
حالا وقتي كه پروژه را Run مي كنيم با وارد نمودن آدرس زير در Browser مي توانيم XSD  مربوط به اين نوع را كه بعد ها كلاينت از روي اين XSD نوع مربوط را مي سازد مشاهده كنيم .
http://localhost:8000/service?xsd=xsd2
بعده ها توضيح خواهيم داد كه پارامترهايي كه به صورت Query String در اين لينك هستند چه عملي را انجام مي دهند .
شماي XSD  به صورت زير ظاهر مي گردد :


```
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" 
           targetNamespace="http://schemas.datacontract.org/2004/07/WcfTest" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:tns="http://schemas.datacontract.org/2004/07/WcfTest">
  <xs:complexType name="Employee">
    <xs:sequence/>
  </xs:complexType>
  <xs:element name="Employee" nillable="true" type="tns:Employee"/>
</xs:schema>
```

بدين وسيله مي توانيم نوع داده هاي Complex را انتقال دهيم . با كمي دقت در XSD بالا متوجه مي شويم كه فيلد Identification اين XSD وجود ندارد براي اينكه بتوانيم اين فيلد را نيز به CLR اعلام نماييم مي بايست از DataMemberAttribute  استفاده نماييم كه با اضافه كردن آن تعريف كلاس به شكل زير خواهد درآمد :
[DataContract()]
    public class Employee
    {
        int _id;
        public Employee(int ID)
        {
            _id = ID;
        }
        [DataMember()]
        public int Identification
        {
            get
            {
                return _id;
            }
            set
            {
                if (value <= int.MaxValue)
                    _id = value;
            }
        }
    }
حال پروژه را Run مي كنيم و مجددا لينك زير را چك مي كنيم :
http://localhost:8000/service?xsd=xsd2
مشاهده مي كنيم كه فيلد Identification ‌ نيز اضافه گرديده است :


```
<xs:schema elementFormDefault="qualified" 
           targetNamespace="http://schemas.datacontract.org/2004/07/WcfTest" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:tns="http://schemas.datacontract.org/2004/07/WcfTest">
  <xs:complexType name="Employee">
    <xs:sequence>
      <xs:element minOccurs="0" name="Identification" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Employee" nillable="true" type="tns:Employee"/>
</xs:schema>
```

زماني كه شما در ويژوال استديو گزينه  Add Service Reference ‌را انتخاب مي كنيد ويژوال استديو با استفاده از همين XSD نوع ارائه شده توسط سرويس را مي سازد . لازم به ذكر است كه اين Attribute ها هر كدام داراي تعدادي پارامترهاي نامي هستند كه اضافه كردن آنها بحث را به درازا خواهند كشاند كه شما مي توانيد خود مطالعه فرماييد و مشكلات خود را در اينجا بپرسيد و اين موضوع WCF بسيار گسترده است و به نظر من بهتره يه راه حلي پيدا كرد تا سرعت انتقال مطالب بالا برود .

----------


## Mrs.Net

جناب farzin.fz منتظر ادامه کار شما هستم
مخصوصا بعد از این قسمت اگه میشه درمورد انواع آدرس دهیها و بخصوص آدرس دهی شبکه با یک پورت خاص توضیح بدید
ممنون

----------


## farzin.fz

Service Endopoint
Service Endpoint  در حقيقت نقطه اي مي باشد كه در آن WCF Service ما سرويس دهي خود را انجام مي دهد و براي اينكه بتوانيم اين نقطه را ايجاد نماييم بايد سه عنصر زير را تشكيل دهيم :
َAddress
Binding
Contract
معمولا به اين سه عنصر ABC of Service Endpoint  گفته مي شود و البته ناگفته نماند كه يك سرويس مي تواند چندين Service Endpoint داشته باشد .
Address 
آدرس خود از چهار قسمت تشكيل شده است :
Scheme : كه تشكيل شده از نام پروتكل و يك دو نقطه بعد از آن مي باشد به طور مثال : TCP :         
Machine : نام ماشين يا سرويس دهنده اي كه سرويس ما روي آن است به طور مثال :    www.Example.com
Port : شماره پورت و يك دو نقطه قبل از آن به طور مثال :     41323 :
Path : معمولا نام سرويس است كه اگر سرويس داخل يك دايركتوري باشد هم مي توان در اينجا مشخص نمود .
تمامي چهار عنصر بالا را مي توان در نمونه آدرس زير مشاهده نمود :
Http://www.example.com:23132/Serivce
Net.tcp://localhost:7123/Services/weather_service

Binding
در حقيقت اين  binding است كه چگونگي دسترسي به يك سرويس را مشخص مي كند از پروتكل گرفته تا امنيت سرويس. يعني به صورت كلي يك binding  خاص مجموعه اي از تنظيمات مي باشد و البته براي راحتي كارWCF تعدادي binding را به صورت پيش فرض در نظر گرفته است ، به طور مثال اگر سرويس دهنده و سرويس گيرنده ما روي يك ماشين باشد يعني Interprocess Communication داشته باشيم مي توانيم از binding پيش فرض netNamedPipeBinding استفاده كنيم .

‍Contract
‍‍Contact هم متد هاي ارائه شده توسط سرويس را نشان مي دهد و معمولا نام اينترفيس سرويس ما مي باشد .

خوب حالا كه تا حدودي در مورد  Service Endpoint  اطلاعاتي بدست آورديم بايد به پياده سازي آن بپردازيم به دو طريق زير مي توانيم اين پياده سازي را اعمال نماييم :
Declaratively
Imperatively
البته در تمام محيط دات نت اين مسئله وجود دارد كه منظور از Declaratively  انجام تغييرات به واسطه Attribute ها و يا Configuration file ها مي باشد حالا مثلا در اينجا اين تغييرات به واسطه Configuration File انجام مي شود ولي مثلا در Code Access Security به واسطه Attribute  ها و Imperatively انجام تغييرات به واسطه كد مي باشد .
Declaratively
براي اين منظور Configuration File زير را در نظر مي گيريم :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfService.Service" >
        <endpoint address ="http://localhost:8000/Service1/" binding="wsHttpBinding" contract="WcfService.IService"  />
      </service>
    </services>      
  </system.serviceModel>
</configuration>

در كد بالا مشاهده مي كنيم كه چگونه اين سه عنصر مشخص گرديده اند حالا فرض كنيم توسط Configuration File زير مي خواهيم بيشتر از يك  Service Endpoint را براي سرويس مشخص كنيم  :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfService.Service" >
        <endpoint address ="http://localhost:1234/Service1/"
                binding="BasicHttpBinding" contract="WcfService.IService"  />        
        <endpoint address ="http://localhost:1234/Service1/SSL" 
                binding="wsHttpBinding" contract="WcfService.IService"  />        
          <endpoint address ="net.tcp://localhost:12345/Service1/”
                binding=”NetTcpBinding” contract=”WcfService.IService”  />
        </service>
    </services>      
  </system.serviceModel>
</configuration>

و البته اين نكته را هم بايد در نظر بگيريم كه آدرس هيچ دو Endpoint نبايد مثل هم باشد .در روش بالا فقط يك مشكل وجود دارد آن هم اينكه يك قسمت از آدرس چندين بار تكرار شده است :
http://localhost:1234/Service1
براي رفع اين مشكل مي توانيم از تگ baseAddress به شكل زير استفاده كنيم :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfService.Service" >
        <host>
          <baseAddresses>
            <add baseAddress ="http://localhost:1234/Service1/" />
            <add baseAddress="net.tcp://localhost:12345/Service1/" />
          </baseAddresses>
        </host>
        <endpoint address =""
                  binding="BasicHttpBinding" contract="WcfService.IService"/>        
        <endpoint address ="SSL" 
                  binding="wsHttpBinding" contract="WcfService.IService"  />        
        <endpoint address =""
                    binding="NetTcpBinding" contract="WcfService.IService"/>
        </service>
    </services>      
  </system.serviceModel>
</configuration>

اگر در كد بالا دقت كنيم متوجه مي شويم كه آدرس Endpoint اول و آخر خالي است و WCF از روي binding  آنها تعيين مي كند كه از كدام baseAddress استفاده نمايند .
‍Impreratively implementation هم بسيار ساده است كه در جلسات بعدي به آنها خواهيم پرداخت .

----------


## .:KeihanCPU:.

ای کاش اینا رو به VB هم بنویسید
با سپاس

----------


## milad1370s

اگه میشه کل اموزش را در یک فایل pdf بگذارید
باتشکر

----------


## حبیب شبستری

چطور  میتونم  یک سرویس wcf رو در پروژه   های  دات نت 2005 استفاده بکنم؟

----------


## keyvan_n

دوستان عزیز(farzin.fz) و (iranmsb)، شما که با این انگیزه کار رو شروع کردین، خواهش می کنم ادامه بدین تا به یک مقصدی برسه. اینجوری ولش نکنین.

----------


## star101

اين تنها تاپيك آموزش wcf  تو اين سايته خواهشا ادامه بدين من واقعا هيچ مرجعي براي يادگيري wcf  پيدا نكردم .

----------


## mohsenkarami

با تشکر از زحمات دوستان خواهش میکنم ادامه بدین چون مطالبتون خیلی مفید بود

----------


## jeyjix

:تشویق: ????????

----------


## farzin.fz

واقعا بابت این وقفه طولانی و از اینکه این مبحث همچنان در ابتدای راه بی تحرک مانده است عذر خواهی می کنم و سعی می کنم به  زودی ادامه دهم.
خوب راستش من هم مثل هر کس دیگری درگیری های خاص خودم را دارم و اینکه مطلب نوشتن برای اینجا هم کار ساده ای نیست چون اول یک مبحثی باید نوشته بشه بعد تست بشه و در آخر تایپ شدنشه که البته من این کار را وظیفه خودم می دونم و انجام می دهم ولی در رابطه با سرعت پیشروی زیاد امیدوار نیستم و اگر هم کسی بتونه مطلبی بنویسه اینجوری امکان تقسیم کار به وجود می آید و سرعت بالا می رود.

----------


## saeid_mh83

با تشکر از مطالبی که مطرح شد... می دونم که نوشتن این مطالب وقت گیر هستش اما اگر لطف کنید مطالب جدید رو اضافه کنید ممنون میشم. 
اصلاً یک سوال کلی تر... منتظر بقیه مطالب باشیم یا کارا زیاد شده مهندس؟
در هر حال ممنون

----------


## mohammad-hossein

لطفا ادامه بدهید

----------


## arman_03

http://bloggingabout.net/blogs/denni...roduction.aspx

----------


## araz_pashazadeh

با تشکر از زحمات دوستان و مطلالب مفیدی که ارائه کردن من از گفته های دوستان یک فایل WORD تهیه کردم ولی قسمت ضمیمه برای من غیر فعال بود نتونستم در اختیار دوستان قرار بدم.

----------


## mmd2009

با سلام

به درخواست خیلی از بچه ها این مطالب رو گرداوری کردم و در قالب یک فایل PDF گذاشتم واسه دانلود و البته نام دو عزیزی که این مطالب رو هم نوشتن رو قرار داده یا حق کسی ضایع نشه اگر قرار شد این مطلب رو به صورت غیر قانونی جایی بذارن. ( البته راه فرار زیاد داره )

لینک دانلود

----------


## mohsen.nikzadeh

سلام
من يك برنامه با سوكت براي دريافت اطلاعات دستگاهها سمت سرور نوشتم بنظرتون بهتر اون رو به برنامه WCF  تغيير بدم يا نه چون من نمي دونم هدف از WCF همين هست يا نه 
درواقع روي دستگاهها برنامه جاوا نوشته شده كه يكسري از اطلاعات رو  روي پورت خاصي ارسال ميكنه و من با IP valid و يك برنامه Win service اين اطلاعات رو روي همون پورت خاص  دريافت ميكنم بنظرتون بايد سبك برنامه نويسيم رو تغيير بدم يا نه اصلا WCF براي اين كار ايجاد نشده مثلا يكي از مشكلات من زياد شدن تردهاي برنامه هست چون درست نميتونم تشخص بدم كه دستگاه قطع ارتباط شده  و از اين قبيل رلطفا راهنمايي كنيد  ممنون

----------


## starlight1983

واقعاً ممنون بخاطر این مطالب عالی
کاشکی بازم ادامه داشته باشه تا به یه جایی برسه که بشه بطور کاربردی ازش استفاده کرد

----------


## barnamenevisjma

با سلام
قبل از هر چیز از این توضیحات عالی دوستان واقعا تشکر میکنم.
میشه در مورد این َApp.config بیشتر توضیح بدین. 
من خودم نیاز دارم که از توی یه پروژه دیگه که از نوع ویندوزی هستش(Windows Form Application) با این سرویس WCF ارتباط
داشته باشم(هر دو روی یک Machine قرار دارن).و همچنین باید بتونم از طریق یک شبکه محلی هم به این سرویس وصل شوم. در واقع نقطه مقابل هم یک سرویس WCF هستش
 که باید بتونم از سرویس هاش استفاده کنم.
منتظر راهنمایی شما هستم. ممنون

----------


## masoudmirabedini

می شه لطفا تفاوت های basicHttpBinding و wsHttpBinding و ... رو هم بگین؟
خیلی خیلی ممنونم

----------


## masoudmirabedini

سلام
خیلی ممنون از مطالب خوبتون.
می شه لطفا راجع به binding ها (انواع binding) تو WCF یه کم کمکم کنین؟
خیلی خیلی ممنونم.

----------


## ardeshir1365

از دوستان کسی در مورد binding ها مطالبی داره؟؟؟؟؟؟؟؟؟؟؟

----------


## rkh

سلام.ممنون از آموزش خوبتون.
لطفا ادامه بدید.

----------


## mehrdad2025

اگر ممکنه این آموزش هار و تحت مثالهایی ارائه کنین تا موضوع بهتر جا بیفته.
با تشکر

----------


## Navid92

ممنون  از همه .کسی هست که این PDF  داشته باشه لینکش خرابه!! اگه دارید بزارید واسه دانلود ممنون!!

----------


## intel_amd

اینطور که متوجه شدم wcf برای نوشتن برنامه های کلاینت سروری هست که میخان به هم لینک شن و تبادل داده کنن , مثل برنامه های چت صوتی - تصویری یا بازی هائی مثل world of war craft که چندین هزار کلاینت به یک سرور وصل میشن و کلاینت ها به صورت لحظه به لحظه و مبتنی بر event که از سمت سرور میاد (نه درخواست های مکرر کلاینت به سمت سرور حتی در لحظه ای که نیاز نیست) باهم تبادل داده میکنن
اگر این تعریف دقیق درست می باشد اطلاع دهید 
با تشکر

----------


## intel_amd

یعنی کسی نمیدونه؟!

----------


## taghipoor_akbar

درسته برای ارتباط بانک با مشتریاش

----------


## sg.programmer

سلام
میشه در مورد این App.config بیشتر توضیح بدین.
چطور  میتونم داخل یک تکس باکس با دادن مقدایری مثل *آدرس و شماره پورت* و... مقدار کانفیگ را تغییر داد

----------


## firoozi90

این آموزش دیگه ادامه نداره؟

----------


## eltmco

دیگه ادامه نداره ؟ 
لطفا ادامه بدید . ممنون

----------

