السلام عليكم ورحمة الله،
هذه بداية مختصرة عن تقنية الـ wcf.. و اقول مختصرة لان هذه التقنية واسعة وبها تفاصيل كثيرة لست ملما بها جميعا في الوقت الحالي، لكني حبيت ان اسجل ما اعرفه الان – و سأضعها على اجندتي ان شاء الله لأفصل بها لاحقا ما ان تسنح لي الفرصة. لهذا لن اتكلم في هذا الدرس عن هذه التقنية بصورة نظرية او اعطاء لمحة تاريخية ، بل سأحاول البدء بتطبيق مباشرة.
نبدء على بركة الله..
عند بناء WCF distributed system بصورة عامة سيكون لدينا ثلاث مكونات اساسية:
1- ملف الـ dll والذي سيحوي على الـ service المراد تكوينها (WCF Service assembly)
2- برنامج يقوم بعمل أستضافة لهذه الـ service (WCF service host)
3- برنامج الـ client المستفيد من هذه الـ service (WCF client)
نحن سنستخدم الـ Visual Studio 2010 مع لغة C# لعمل هذه الاجزاء، و طبعا هناك اكثر من طريقة لانشاء كل جزء، و سنفصل بها لاحقا ان شاء الله.
الان، لنكون برنامج جديد من اجل بناء wcf service – يمكننا ذلك من خلال تكون مشروع جديد من خلال الفيجوال ستوديو- ويكون المشروع من نوع Class Library و في هذه الحالة سنحتاج الى أضافة الـ references يدويا الى المشروع (سنرى هذا لاحقا)
و هناك خيار ثاني و هو انشاء مشروع من نوع WCF Service Library وهنا ستكون جميع المكتبات مضافة الى برنامجنا تلقائيا، وايضا سيكون ملف الـ App.config مضاف الى المشروع (وربما سنتكلم عن هذا الملف لاحقا)
وهناك ايضا خيار ثالث وهو تكون new website ثم اختار WCF Service وهنا عملية الـ hosting ستكون داخل الـ IIS.
لا اظننا سنتعامل مع الخيار الثالث – لكن ان اسعفني الوقت – سنتكلم عن الخيار الاول و الثاني ان شاء الله و توضيح ذلك بأمثلة بسيطة توضح الخطوات التي يجب اتباعها.. لكي تتضح الصورة لدى القارئ الكريم.
سنكون مثال يحوي على service بسيطة وظيفتها جمع عددين ثم ارجاع نتيجة الجمع.
قم بتشغل الـ Visual studio لنبدء بكتابة اول تطبيق لنا.
ستحتاج ان تقوم بتشغيل برنامج الـ VS بصلاحيات الادمن. لعمل ذلك اضغط بالزر الايمن على برنامج الـ VS واختر منها Run as administrator
وهذا الامر مهم والا سيظهر لك اخطاء وقت التنفيذ.
الجزء الاول
كون مشروع جديد من نوع Class Library و سنسميه MyCalcService
قم بأضافة ملف جديد الى المشروع – وذلك بالضغط بالزر الايمن على اسم المشروع كما في الصورة التالية
من النافذة الظاهرة – اختر Interface وسمها IMyCalculator
سيكون الملف بهذا الشكل بعد اضافة الكود النهائي اليه
namespace MyCalcService
{
[ServiceContract()]
public interface IMyCalculator
{
[OperationContract()]
int Add(int num1, int num2);
}
}
(يرجى الانتباه الى كلمة public المضافة قبل كلمة interface )
لو تلاحظ انه لم يتم التعرف على ServiceContract و OperationContract وهذا لاننا لم نقم بأضافة المكتبة المطلوبة، و لأضافتها اضغط بالزر الايمن على اسم المشروع واختار Add Ref.
ثم من الجزء الخاص بـ .NET اختر System.ServiceModel
ثم اضف هذه الجملة في اعلى الكود
using System.ServiceModel;
من نافذة الـ Solution Explorer قم بأعادة تسمية ملف الـ Class1.cs الى MyCalculator.cs
وسيكون الشكل النهائي لهذا الملف كالاتي بعد اضافة الكود اليه
namespace MyCalcService
{
public class MyCalculator : IMyCalculator
{
public int Add(int num1, int num2)
{
return num1 + num2;
}
}
}وهنا قد انتهينا من كتابة الـ service الخاصة بنا – ويمكنك عمل Build للمشروع.
سأوضح المشروع السابق باختصار.
لكي نقوم بعمل service فاول شيء يجب تعريف ما يعرف بـ Service contract.
A service contract is essentially a group of operations that you want to support on the service.
وهذه تم تمثيلها في الكود السابق بـ interface والتي قمنا تعريفها كـ ServiceContract
بعد ذلك قمنا بتعريف الدوال المراد تصديرها من الـ service وفي مثالنا لدينا دالة واحدة فقط وهي دالة الـ Add والتي تم تعريفها على انها OperationContract. وهذا الامر يجب ان نفعله مع اي دالة نريد ان نصدرها من الـ service.
يعني مثلا للتوضيح لو اردنا ان نقوم بالعمليات الحسابية الاربعة سيكون حينها شكل الـ service كالاتي:
[ServiceContract()]
public interface IMyCalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
وبعد تعريف الـ interface نقوم بتعريف class لعمل implementation لهذه الـ service.
--
هنا انتهينا من الجزء الاول و سننتقل الى الجزء الثاني و هو عمل hosting لهذه الـ service.
الجزء الثاني
قم بأضافة مشروع جديد الى الـ solution الحالي. قم بالضغط بالزر الايمن على اسم الـ solution كما في الصورة
سنكون مشروع من نوع Console Application ونسمه MyCalcServiceHost
كما فعلنا في البرنامج السابق قم بأضافة System.ServiceModel الى المشروع. ثم سنقوم اضافة Ref. اخر، لكن هذه المرة من الجزء الخاص بـ Projects اختر المكتبة الناتجة من المشروع الاول
الان قم بأضافة جمل الـ using في اعلى الجزء الخاص بالكود
using System.ServiceModel; using System.ServiceModel.Description;
دالة الـ Main ستكون كالتالي
class Program
{
static void Main(string[] args)
{
Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");
ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator), httpUrl);
host.AddServiceEndpoint(typeof(MyCalcService.IMyCalculator), new WSHttpBinding(), "");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
host.Open();
Console.WriteLine("Service is hosted at " + DateTime.Now.ToString());
Console.WriteLine("Host is up and running... Press <Enter> key to stop");
Console.ReadLine();
}
}
لفهم الكود التالي نحتاج الى توضيح بعض الامور المتعلقة بـ WCF.. سأاجل هذه الامور الى الدرس القادم ان شاء الله.. وهنا سأكتفي بوضع الكود فقط.
الان يمكنك تنفيذ البرنامج. اضغط بالزر الايمن على اسم المشروع واختر كما في الصورة
ثم نفذ البرنامج.
الان سنقوم بعمل برنامج client لأستخدام الـ service الخاص بنا.
سنكون مشروع جديد من نوع Console App. و سنسميه ConsoleHost
(يمكنك ان تضيف مشروع جديد الى الـ solution الحالي او ان تشغل نسخة جديدة من برنامج الـ VS و تنشئ مشروع جديد)
لتتعامل مع الـ service من خلال الـ client يجب ان تكون ما يعرف بالـ proxy
لعمل ذلك هناك طريقتين
اولا – بأستخدام الاداة svcutil.exe و التي يمكن تشغيلها من خلال الـ cmd الخاص بالـ VS والذي يمكن ان تصل اليه من خلال قائمة start
مع ملاحظة انه ايضا يجب تشغيله تحت صلاحيات admin
(و نحن في هذا المثال لن نستخدم هذه الطريقة)
الطريقة الثانية لعمل الـ proxy هي من خلال الـ VS وذلك بالضعط بالزر الايمن على المشروع و اختيار كما في الصورة
في النافذة التي تظهر قم بأدخال عنوان الـ service التي تريد الوصول اليها.
عندما قمنا بعمل hosting لل service في الكود في الاعلى – قمنا باعطاء هذا العنوان
http://localhost:8080/SimpleCalculator
وهذا هو عنوان ال service الذي يجب ادخاله هنا.
طبعا هنا يجب ان تكون ال service شغالة. يعني برنامج ال hosting يجب ان يكون شغال في هذه الاثناء.
انا لدي ثلاث مشاريع في ال solution
سأقوم اولا بتنفيذ برنامج ال hosting بالضغط على Ctrl + F5 لكي يكون التنفيذ بدون debug لكي استطيع العودة و التعامل مع برنامج ال VS
الان من النافذة التي تظهر عند اختيار Add Service Ref. سنقوم بأدخال عنوان ال service
ثم نضغط على Go
لاحظ ان ال service الخاصة بي ستظهر
الان يمكنك الضغط على زر OK
لاحظ انه تمت اضافتها الى المشروع
ومن خلال ال Object Browser يمكنني مشاهدة ال class والدالة الخاصة بال service .
الان سنضيف الكود المطلوب
في دالة ال Main اضف
MyCalculatorClient ch = new MyCalculatorClient();
Console.WriteLine(ch.Add(4, 5).ToString());
Console.ReadLine();
واضف في اعلى البرنامج جملة ال using
using Consolehost.ServiceReference1;
مع ملاحظة ان هذه الجملة ستختلف حسب اسم برنامجك – و لهذا يمكنك الضغط على MyCalculatorClient بالزر الايمن و اختيار Resolve لكي يقوم ال VS باضافة المكتبة لك.
الان لدي برنامج ال hosting منفذ مسبقا و هو قيد التنفيذ حاليا.
ساقوم بعمل برنامج ال client على انه البرنامج الاساسي للتنفيذ ثم اقوم بتنفيذه
مبروك الان انتهيت من تنفيذ برنامجك الاول.
اعلم انه هناك بعض الامور بحاجة الى التوضيح. سأحاول ان اوضحها في درس لاحق.
و ايضا سأحاول التطرق الى عملية ال hosting فهناك اكثر من طريقة لعمل ذلك.. سأحاول التفصيل اكثر اذا شاء الله و سنح لي الوقت.
و السلام عليكم




