Tayseer_Project

البداية مع الـ WCF

17 ردود في هذا الموضوع

السلام عليكم ورحمة الله،

 

هذه بداية مختصرة عن تقنية الـ 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

 

post-273228-0-23897400-1367170636.png

 

وهذا الامر مهم والا سيظهر لك اخطاء وقت التنفيذ.

 

الجزء الاول

 

كون مشروع جديد من نوع Class Library و سنسميه MyCalcService

 

post-273228-0-68107200-1367170650_thumb.

 

قم بأضافة ملف جديد الى المشروع – وذلك بالضغط بالزر الايمن على اسم المشروع كما في الصورة التالية

 

post-273228-0-04876500-1367170666_thumb.

 

من النافذة الظاهرة – اختر Interface وسمها IMyCalculator

 

post-273228-0-40282800-1367170681_thumb.

 

سيكون الملف بهذا الشكل بعد اضافة الكود النهائي اليه

namespace MyCalcService{    [ServiceContract()]    public interface IMyCalculator    {        [OperationContract()]        int Add(int num1, int num2);    }}

 

(يرجى الانتباه الى كلمة public المضافة قبل  كلمة interface )

لو تلاحظ انه لم يتم التعرف على ServiceContract و OperationContract وهذا لاننا لم نقم بأضافة المكتبة المطلوبة، و لأضافتها اضغط بالزر الايمن على اسم المشروع واختار Add Ref.

 

post-273228-0-18942000-1367170696_thumb.

 

ثم من الجزء الخاص بـ .NET اختر System.ServiceModel

 

post-273228-0-88400400-1367170710_thumb.

 

ثم اضف هذه الجملة في اعلى الكود

 

using System.ServiceModel;

من نافذة الـ Solution Explorer قم بأعادة تسمية ملف الـ Class1.cs الى MyCalculator.cs

 

post-273228-0-81625700-1367170726.png

 

وسيكون الشكل النهائي لهذا الملف كالاتي بعد اضافة الكود اليه

 

 

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 كما في الصورة

 

post-273228-0-20782000-1367170741_thumb.

 

سنكون مشروع من نوع Console Application ونسمه  MyCalcServiceHost

 

post-273228-0-89807500-1367170755_thumb.

 

كما فعلنا في البرنامج السابق قم بأضافة System.ServiceModel الى المشروع. ثم سنقوم اضافة Ref. اخر، لكن هذه المرة من الجزء الخاص بـ  Projects اختر المكتبة الناتجة من المشروع الاول

 

post-273228-0-25714500-1367170770_thumb.

 

الان قم بأضافة جمل الـ 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.. سأاجل هذه الامور الى الدرس القادم ان شاء الله.. وهنا سأكتفي بوضع الكود فقط.

 

الان يمكنك تنفيذ البرنامج. اضغط بالزر الايمن على اسم المشروع واختر كما في الصورة

 

post-273228-0-93581100-1367170994.png

 

ثم نفذ البرنامج.

 

post-273228-0-87737400-1367171008_thumb.

 

الجزء الثالث

 

الان سنقوم بعمل برنامج client لأستخدام الـ service الخاص بنا.

 

سنكون مشروع جديد من نوع Console App.  و سنسميه ConsoleHost

(يمكنك ان تضيف مشروع جديد الى الـ solution الحالي او ان تشغل نسخة جديدة من برنامج الـ VS و تنشئ مشروع جديد)

 

لتتعامل مع الـ service من خلال الـ client يجب ان تكون ما يعرف بالـ proxy

لعمل ذلك هناك طريقتين

اولا – بأستخدام الاداة svcutil.exe و التي يمكن تشغيلها من خلال الـ cmd الخاص بالـ VS والذي يمكن ان تصل اليه من خلال قائمة start

مع ملاحظة انه ايضا يجب تشغيله تحت صلاحيات admin

 

post-273228-0-16192100-1367171023_thumb.

 

(و نحن في هذا المثال لن نستخدم هذه الطريقة)

 

الطريقة الثانية لعمل الـ proxy هي من خلال الـ VS وذلك بالضعط بالزر الايمن على المشروع و اختيار كما في الصورة

 

في النافذة التي تظهر قم بأدخال عنوان الـ service التي تريد الوصول اليها.

عندما قمنا بعمل hosting لل service في الكود في الاعلى – قمنا باعطاء هذا العنوان

http://localhost:8080/SimpleCalculator

وهذا هو عنوان ال service الذي يجب ادخاله هنا.

طبعا هنا يجب ان تكون ال service شغالة. يعني برنامج ال hosting  يجب ان يكون شغال في هذه الاثناء.

 

انا لدي ثلاث مشاريع في ال solution

سأقوم اولا بتنفيذ برنامج ال hosting بالضغط على Ctrl + F5 لكي يكون التنفيذ بدون debug لكي استطيع العودة و التعامل مع برنامج ال VS

الان من النافذة التي تظهر عند اختيار Add Service Ref. سنقوم بأدخال عنوان ال service

 

post-273228-0-07031200-1367171053_thumb.

 

ثم نضغط على Go

 

لاحظ ان ال service الخاصة بي ستظهر

 

post-273228-0-60178500-1367171067_thumb.

 

الان يمكنك الضغط على زر OK

لاحظ انه تمت اضافتها الى المشروع

 

post-273228-0-40082200-1367171082_thumb.

 

ومن خلال ال Object Browser يمكنني مشاهدة ال class والدالة الخاصة بال service .

 

post-273228-0-77590600-1367171097_thumb.

 

الان سنضيف الكود المطلوب

 

في دالة ال Main اضف

            MyCalculatorClient ch = new MyCalculatorClient();            Console.WriteLine(ch.Add(4, 5).ToString());            Console.ReadLine();

 

واضف في اعلى البرنامج جملة ال using

using Consolehost.ServiceReference1;

مع ملاحظة ان هذه الجملة ستختلف حسب اسم برنامجك – و لهذا يمكنك الضغط على MyCalculatorClient بالزر الايمن و اختيار Resolve لكي يقوم ال VS باضافة المكتبة لك.

 

الان لدي برنامج ال hosting منفذ مسبقا و هو قيد التنفيذ حاليا.

ساقوم بعمل برنامج ال client على انه البرنامج الاساسي للتنفيذ ثم اقوم بتنفيذه

 

post-273228-0-33991500-1367171112_thumb.

 

post-273228-0-88532200-1367171127_thumb.

 

مبروك الان انتهيت من تنفيذ برنامجك الاول.

 

اعلم انه هناك بعض الامور بحاجة الى التوضيح. سأحاول ان اوضحها في درس لاحق.

 و ايضا سأحاول التطرق الى عملية ال hosting فهناك اكثر من طريقة لعمل ذلك.. سأحاول التفصيل اكثر اذا شاء الله و سنح لي الوقت.

 

و السلام عليكم

post-273228-0-13726700-1367171038.png

تم تعديل بواسطه Tayseer_Project
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله،

 

في الدرس الماضي رأينا عمليا كيف من الممكن عمل WCF Service ثم كيف الوصول اليها من خلال الـ client.

قبل البدء في هذا الدرس اود ان اوضح نقطة بخصوص الدرس السابق وهي ان جزء الـ client (اقصد الخطوات التي اتبعناها لكتابة برنامج الـ client) يمكن ان تنفذ من حاسبة ثانية غير الحاسبة التي تستضيف الـ service. فقط سيتطلب الامر اعطاء الـ IP الخاص بالحاسبة المستضيفة.

مثلا لو لديك حاسبتين على نفس الشبكة و لنفرض عناوينها

10.0.0.1

10.0.0.2

 

لو قمت ببناء الـ service على الحاسبة الاولى ثم تريد استضافتها عليها – كل ما عليك فعله هو تغير الكود السابق في الدرس الاول في برنامج ال hosting وتحديدا هذا السطر

  Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");      

الى

 

  Uri httpUrl = new Uri("http://10.0.0.1:8080/SimpleCalculator");      

ثم على الحاسبة الثانية عند بناء برنامج الـ client يجب اعطاء هذا العنوان في هذه النافذة

 

 

post-273228-0-69232900-1367542964_thumb.

 

و هذا كل ما في الامر!!

 

الان دعونا نبدء بدرسنا الثاني

 

في الدرس السابق كان لدينا برنامج عملي بعيد عن كثير من التوضيحات التي تخص تقنية ال wcf.. لذا في هذا الدرس – مستعينا بالله - اود ان اوضح بعض هذه الامور.

ساتكلم اولا عن ما يعرف ب The ABCs of WCF

 

لكي يتم الاتصال بين برنامج ال client وبرنامج ال host يجب ان تكون هنالك ثلاث امور معروفة والتي يرمز لها اختصارا ب ABC وهي

 

1-  Address2-  Binding3-  Contract

 

 

الامر الاول وهو العنوان Address الخاص بال service. وهذا الامر حددناه في برنامجنا السابق في هذه الجملة

 

  Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");     

طبعا العنوان يجب ان يكون unique  وهو يتكون من اكثر من جزء

 

الجزء الاول هو البروتوكول المستخدم – وهو في مثالنا http

الجزء الثاني هو machine or domain والذي كان ممثلا ب localhost – وهو اما اسم الحاسبة او ال IP الخاص بها.

الجزء الثالث وهو رقم ال port  وهو اختياري لان لدينا ال default port – مثلا عند استخدامنا لل  Http Binding سيكون ال port هو 80.

ثم اخيرا ال path الخاص بال service.

 

ملاحظة:

1-      لو اردنا استخدام TCP Address فيجب  كتابة net.tcp بدل http فسيكون لدينا عنوان كالاتي مثلا:

 

Net.tcp://localhost:8888/MyService

2-     الـ WCF يمكن ان تستخدم للأتصال بين two processes على نفس الحاسبة (ما يعرف ب Inter-Process Communication)  في هذه الحالة يجب استخدام net.pipe في بداية ال address.

 

الامر الثاني وهو ال Binding والذي نستخدمه لتحديد نوع ال network protocol  - مثلا http او tcp و غيرها - وهذه البروتوكولات مدعومة ضمنيا مع ال wcf – ولو تلاحظون في البرنامج السابق قمنا باستخدام WSHttpBinding لتحديد نوع البروتوكول.. و هناك عدة انواع اخرى مثلا

BasicHttpBinding

NetTcpBinding

 

ومن خلال ال binding يمكننا ايضا تحديد امور اخرى مثلا تحديد ال channels هل ستكون one-way, request-reply, or duplex

ايضا يمكننا تحديد ال encoding مثلا xml or binary

 

الامر الثالث  وهو ال Contract وهي ال service نفسها – والتي كانت ممثلة ب interface و التي تحوي على ال methods التي تصدرها ال service للعالم الخارجي!

كما لاحظتم في البرنامج الاول يجب ان نعرف ال interface بهذا الشكل

 

    [ServiceContract]    public interface IMyCalculator

 

             اي يجب استخدام     [serviceContract] قبل التعريف. ثم عندما نعرف ال methods يجب ان نسبقها ب

 

        [OperationContract]

 

ولا مانع من ذكر هذه الامور باللغة الانكليزية مأخوذة من كتاب

Pro WCF 4 Practical Microsoft SOA Implementation 2nd Edition

 

-          The address specifies where the messages can be sent (or where the service lives).-          The binding describes how to send the messages.-          The contract describes what the messages should contain.

هذه الامور الثلاثة مجتمعة تسمى endpoint والتي تعتبر كبوابة gateway يتم من خلالها التعامل مع ال service. طبعا كل service عند بنائها يجب ان تحوي على الاقل endpoint واحدة – ممكن اكثر طبعا. هذا بالنسبة لبرنامج ال service او على الجهة اخرى – واقصد بها ال client side – سيكون لدينا endpoint  واحدة فقد لل service. طبعا يمكن لبرنامج ال client ان يتصل مع اكثر من service ولكل service يكون لها endpoint خاصة بها. لكن لل service  الواحدة سيكون لدينا endpoint واحدة.

 

 

برمجيا – لتعريف endpoint – اما يتم ذلك عن طريق الكود كما فعلنا في البرنامج السابق و استخدمنا مثلا هذه الدالة AddServiceEndpoint – او يمكننا استخدام ملف ال app.config والذي هو اسهل ويجنبك الاخطاء الاملائية حيث يمكنك استخدام wizard للتعامل معه.

اذا تذكرون في بداية الدرس السابق قلنا هناك اكثر من طريقة لتكوين مشروع لبناء service وكانت الطريقة الاولى هي بناء مشروع من نوع Class Library – وهذا ما استخدمناه في برنامجنا الاول – وقلنا هذا يتطلب اضافة المكتبات المطلوبة يدويا – اضافة الى انه لا يحوي على ملف app.config.

الطريقة الثانية التي ذكرناها هي بناء مشروع من نوع WCF Service Library والتي ستقوم مباشرة بتكوين ملف ال app.config مع اضافة المكتبات المطلوبة.. في الدروس القادمة سنتعامل قليلا مع هذه الطريقة.

 

ملاحظة: أريد ان اشير هنا الى نقطة. في برنامج ال host  في الدرس السابق استخدمنا دالة AddServiceEndpoint لاضافة endpoint. قد تجد ربما في بعض الامثلة على النت او في الكتب – ان برنامج ال host يكون ابسط من برنامجنا في مثالنا الاول حيث يتكون فقط من شيء من هذا القبيل

 

            Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");                       ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator), httpUrl);            host.Open();

 

دون ان يضيف endpoint بصورة واضحة! هذا يتم فقط مع ال .NET 4.0 وما يليها حيث تم اضافة خاصية Default Endpoints – اي هناك endpoints معرفة يتم استخدامها في حالة عدم تحديد واحدة بصورة صريحة.

 

دعوني الخص موضوع ال endpoint بهذه النقاط

 

-          Every service must expose at least one endpoint.-          Each endpoint has exactly one contract.-          All endpoints on a service have unique addresses-          A single service can expose multiple endpoints-          You can configure endpoints either administratively (using a config file) or programmatically.

موضوع اخير اريد الحديث عنه ايضا و هو عملية ال hosting. في البرنامج السابق قمنا بكتابة Console Application لعمل استضافة لل service الخاصة بنا بالاعتماد على ServiceHost class – هذه الطريقة تسمى ب Self-hosting وهناك انواع عديدة اخرى لعملية ال hosting مثلا

 

-          Hosting using IIS-          Hosting in windows services-          Hosting in Windows Azure

ربما سنفصل اكثر في هذه الطرق اذا استخدمناها مستقبلا ان شاء الله.

 

لازال الامر يتطلب الكثير من الكلام و التطبيق العلمي - ان شاء الله نكمل في اقرب وقت.

تم تعديل بواسطه Tayseer_Project
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله،

 

هذا الدرس ممكن اعتباره ملحق للدرس السابق. سأقوم بأعادة كتابة نفس البرنامج في الدرس الاول لكن هذه المرة سأقوم بتعريف ال endpoint الخاصة بال service في ملف ال config.

لذا يمكنك فتح البرنامج في المثال الاول للتعديل عليه.

سيكون تعديلنا على الجزء المتلعق ببرنامج ال hosting.

اضغط بالزر الايمن على مشروع ال hosting والذي كان اسمه MyCalcServiceHost و اختر Add à new item

ثم اختر Application Config. File

 

post-273228-0-67621300-1367628272_thumb.

 

ستكون لديك ملف كما في الصورة

 

post-273228-0-15343700-1367628289_thumb.

 

وهنا يمكنك ان تقوم بأضافة ال endpoints الخاصة ب service.

سنقوم بتعديل هذا الملف كالاتي:

 

<?xml version="1.0" encoding="utf-8" ?><configuration>  <system.serviceModel>    <services>      <service name = "MyCalcService.MyCalculator"               behaviorConfiguration="MyCalcServiceMEXBehavior">        <endpoint address = ""        binding = "basicHttpBinding"        contract = "MyCalcService.IMyCalculator"/>        <endpoint address = "mex"        binding = "mexHttpBinding"        contract = "IMetadataExchange" />        <host>          <baseAddresses>            <add baseAddress = "http://localhost:8080/SimpleCalculator"/>          </baseAddresses>        </host>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior name = "MyCalcServiceMEXBehavior" >          <serviceMetadata httpGetEnabled = "true" />        </behavior>      </serviceBehaviors>    </behaviors>  </system.serviceModel></configuration>

 

الان – اذهب الى ملف Program.cs التابع لبرنامج ال host و غيره كالاتي

 class Program    {        static void Main(string[] args)        {                       //Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");                       ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator));            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();        }    }

لاحظ اننا قمنا بحذف الكود الخاص بتعريف ال endpoint وذلك لاننا قمنا بأضافتها عن طريق ملف ال config.

الان اضغط ctrl + F5 لتنفيذ البرنامج. دع البرنامج يتنفذ واذهب الى مشروع ال client و اضغط بالزر الايمن على ServiceReference1 واختر Update Service Reference. كما في الصورة

 

post-273228-0-85433100-1367628305_thumb.

ثم قم بتنفيذ البرنامج – وستحصل على نفس النتيجة في الدرس الاول.

 

طبعا بقي ان نشرح ملف ال config و خاصة الجزء الخاص ب IMetadataExchange و هذا ما سأقوم به في الدرس القادم ان شاء الله.

و السلام عليكم ورحمة الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله،

هذا الدرس سيكون تطبيق عملي – سنأخذ مثال بسيط يوضح بعض الامور عمليا ثم بعدها سنعود لنتكلم عن بعض الامور نظريا ان شاء الله.

في الدرس الاول ذكرتُ التالي:

 

و هناك خيار ثاني و هو انشاء مشروع من نوع WCF Service Library وهنا ستكون جميع المكتبات مضافة الى برنامجنا تلقائيا، وايضا سيكون ملف الـ App.config مضاف الى المشروع (وربما سنتكلم عن هذا الملف لاحقا

وهذا ما سنتعامل معه في هذا الدرس. سنرى كيف ان الـ Visual Studio توفر عليّ الوقت و الجهد مع هذه المشاريع.

كون مشروع جديد من نوع WCF Service Library

وسمه AdditionServiceLibrary

post-273228-0-34525700-1367713980_thumb.

الان لو تلاحظ من ال solution explorer انه مباشرة تم تكوين ملف ال interface ثم class يقوم بتطبيق هذه ال interface اضافة الى ملف ال config

post-273228-0-78137100-1367713997.png

قم بحذف ملفي ال Service1.cs و IService1.cs و ذلك بتحديدهما و الضغط على زر delete. و سنقوم نحن بأضافة الملفات من الصفر.

ال service التي سنقوم بتطبيقها ستكون عبارة عن دالة لجمع عددين من نوع complex

كما في الخطوات بالامثلة السابقة عموما – سنحتاج الى تعريف interface ثم class يعمل تطبيق لهذه ال interface – اضافة انه في مثالنا هذا سنتحتاج ان نضيف class اخر لتمثيل الارقام من نوع complex. لعمل كل هذه الامور – يمكننا اما ان نضيف ثلاث ملفات (ملف لكل نقطة) او يمكننا ان نضيف ملف واحد و نقوم بتعريف جميع هذه الامور ضمنه (وهذا ما سنفعله في مثالنا هذا)

قم بأضافة ملف من نوع class الى المشروع و سمه مثلا AdditionService

 

post-273228-0-37182500-1367714016_thumb.

ثم سنقوم بأضافة الكود – و سيكون كاملا كالاتي:

 

namespace AdditionServiceLibrary{    [DataContract]    public class Complex    {        [DataMember]        public int real;        [DataMember]        public int imag;    }    [ServiceContract]    public interface IAdditionService    {        [OperationContract]        Complex Add(Complex c1, Complex c2);    }    public class AdditionService : IAdditionService    {        public Complex Add(Complex c1, Complex c2)        {            Complex result = new Complex();            result.real = c1.real + c2.real;            result.imag = c1.imag + c2.imag;            return result;        }    }}

قمنا اولا بتعريف ال class الخاص ب complex ثم عرفنا ال interface لل service ثم قمنا بأضافة ال class الذي يعمل تطبيق لهذه ال interface وهو يحوي على دالة لجمع عددين من نوع complex.

الدالة ستستلم عددين نوع complex و تقوم بأرجاع نوع complex – اي ان هذا ال class سيتم ارساله بين ال service وال client، ولهذا لاحظ تعريف ال complex class كان مختلف قليلا عن تعريف اي class بالصورة الاعتيادية. اقصد اننا سبقناه ب [DataContract] ثم سبقنا كل عضو داخل هذا ال class ب [DataMember] وهذا لكي يتم نقل هذا ال class بين ال service و ال client.

 

اضغط double click على ملف الApp.config  وسنقوم بتعديلات بسيطة عليه و ذلك لان هذا الملف مكتوب لملف ال Service1.cs و ملف ال IService1.cs الذين قمنا بحذفهما – لذا سنقوم بكتابة AdditionService بدل Service1 و IAdditionService بدل IService1

بالمحصلة سيكون الملف كالاتي:

 

<?xml version="1.0" encoding="utf-8" ?><configuration>  <system.web>    <compilation debug="true" />  </system.web>  <system.serviceModel>    <services>      <service name="AdditionServiceLibrary.AdditionService">        <host>          <baseAddresses>            <add baseAddress = "http://localhost:8732/Design_Time_Addresses/AdditionServiceLibrary/AdditionService /" />          </baseAddresses>        </host>        <endpoint address ="" binding="wsHttpBinding" contract="AdditionServiceLibrary.IAdditionService">          <identity>            <dns value="localhost"/>          </identity>        </endpoint>        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior>          <serviceMetadata httpGetEnabled="True"/>          <serviceDebug includeExceptionDetailInFaults="False" />        </behavior>      </serviceBehaviors>    </behaviors>  </system.serviceModel></configuration>

طبعا نحن انشئنا مشروع من نوع WCF Service Library وهذا كما ذكرنا يوفر و يسهل على المطور بعض الامور.

اذا تذكرون في التطبيقات السابقة – كنا بعد ان ننتهي من كتابة ال service كنا نقوم بعمل لها hosting.

الان ومع هذا النوع من البرامج – يمكنني ان انفذ البرنامج بعد الانتهاء من كتابة ال service وقبل عمل hosting لها.

الان قم بتنفيذ البرنامج – لاحظ ان ال VS سيستدعي برنامج WCF Test Client والذي من خلاله يمكنك التاكد من ال service التي قمت بتطويرها و انها تعمل بصورة صحيحة.

لاحظ الصورة

 

post-273228-0-58271300-1367714243_thumb.

 

يمكنك من خلال هذه النافذة ادخال قيم الادخال للدالة Add ثم الضغط على Invoke

و ستظهر لك النتيجة في الجزء السفلي.

 

هذا الامر فقط للتأكد من ان ال service تعمل بصورة صحيحة – و بعدها يمكنك عمل ال Hosting ثم كتابة برنامج Client للتعامل مع هذه ال service.

 

اريد ان اتكلم عن امر اخر.

لو رجعت الى الفيجوال استوديو.

كما رأينا ملف ال config يمكنك ان تعدل عليه من خلال الكود. هناك طريقة اخرى اسهل وهي، اضغط بالزر الايمن على ملف ال config واختر كما في الصورة

 

post-273228-0-14750200-1367714050_thumb.

 

ستظهر لك هذه النافذة

 

post-273228-0-44877200-1367714067_thumb.

 

والتي من خلالها يمكنك التعديل على هذا الملف بسهولة.

مثلا لأضافة endpoint جديدة نقوم بالاتي:

 

post-273228-0-62728400-1367714084_thumb.

 

ثم اسم ال interface

 

post-273228-0-44705800-1367714101_thumb.

 

ثم طريقة الاتصال – و لتكن مثلا tcp

 

post-273228-0-35350700-1367714119_thumb.

 

ثم نعطي العنوان

 

post-273228-0-60642300-1367714136_thumb.

 

واخيرا Finish

 

لاحظو الان تم اضافة endpoint جديدة

 

post-273228-0-55070400-1367714260_thumb.

طبعا لانه البرنامج بالاساس كان يحوي على two endpoints سيكون الان لدينا three endpoints.

عند غلق ال editor سيطالبك بالخزن اضغط نعم – ثم اضغط yes ليقوم باعادة تحميل ملف ال config لترى التغيير في الكود الخاص بالملف.

 

طبعا عن طريق ال Config. Editor يمكنني انجاز الكثير من الامور و بسهولة – كما لاحظتم –

 

الان يمكنك ان تعمل Hosting لهذه ال service كما تعلمنا في الدروس السابقة – لكني انوي ان شاء الله ان اغير طريقة ال hosting – كما ذكرنا هناك اكثر من طريقة لهذا الامر – ونحن كنا نستخدم ال self-hosting وانا انوي ان شاء الله ان استخدم طريقة ال windows services في درس قادم ان شاء الله.

 

ما بقي من امور مهمة سأوضحها في قادم الدروس ان شاء الله:

1-  الحديث عن ملف ال config والذي لم نعطيه حقه الى الان مع بعض التطبيقات بأستخدام ال editor.

2-  عملية ال hosting بأستخدام ال windows services.

 

و السلام عليكم ورحمة الله

تم تعديل بواسطه Tayseer_Project
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا ولا ينقطع عمل ابن ادم الا من ثلاث منهم علم ينتفع به اسئل الله ان يجعله فى ميزان حسناتك

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاكم الله عنا خير الجزاء

 

وأسأل الله عز وجل ان يكون هذا في ميزان حسناتك .. وسأتابع دروسك بإذن الله ..

 

والموضوع مهم جدا وأحتاجه بشدة

وأنتظر باقي دروسك إن شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الأخ العزيز تيسير .. أنا أكتب بلغة الفيجوال بيسك ليست هذه المشكلة ولكني أحببت أن أعلمك بأي لغة أكتب .. فلا أحب التغير الأن إلي السي شارب .. وليست عندي مشكلة في ترجمة الكود .. فأنا اعلم عن السي شارب ليس بالقليل ..

 

جزاكم الله خيرا علي ما قدمت .. وأنا أستفيد جدا بمجرد قرائتي لهذه الدروس .. وسوف تكثر أسألتي عن هذا الموضوع لأني عندي الكثير من التضاربات

 

بعد كتابتي للمشروع الأول وقمت بتنفيذه ظهر هذا الخطأ

post-51117-0-65787500-1371542601_thumb.j

 

فقمت بتحميل البرنامج تبعك المرفق وعند تنفيذه ظهر هذا الخطأ

 

post-51117-0-13988200-1371542569_thumb.j

 

في هذا السطر

Dim httpUrl As New Uri("http://localhost:8080/SimpleCalculator")

لماذا كتبت SimpleCalculator   ولم تكتب مثلا أي أسم أخر ؟؟

 

أنتظر ردك سيدي وجزاكم الله خيرا

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الصورة الثانية سأجيب علي نفسي .. وهي أن سيادتك أخبرت أن نقوم بتشغيل البرنامج في وضع المدير وأنا لم أقم بهذا لذا ظهر هذا الخطا وعند تشغيلي له في وضع المدير عمل بدون أي مشكلة

 

أنتظر الإجابة علي باقي أسئلتي وجزاكم الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي تيسير :

 

لماذا أقوم بعمل Interface  تسمي IMyCalculator

حيث البرنامج بدونها يعمل بلا مشكلة ؟؟؟

 

اعذرني لكثرة أسئلتي ... فعندي الكثير من التضاربات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي تيسير :

 

حدث لي خطأ في خطوة Add Service Ref

   Sub Main()        Dim httpUrl As New Uri("http://localhost:8080/SimpleCalculator")        Dim host As New ServiceHost(GetType(MyCalculator), httpUrl)        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()    End Sub

هذا ما كتبته لكي أقوم بتنفيذ الكود بدون أخطاء

 

وهذه صورة الخطأ

post-51117-0-09291000-1371545406_thumb.j

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك اخي 1z1z و جزاك الله بالمثل.

 

اهلا بك اخي عمرو - وان شاء الله استفدت من الدروس.

اسأل الله ان يبارك في اوقاتنا لاستطيع  اكمال بقية الدروس.

موضوع ال WCF دقيق نوعا ما ويتطلب ان تكون انت كذلك دقيق في الخطوات - يجب ان تتبع الخطوات المذكورة بالضبط والا تظهر لك الاخطاء.

انا ايضا مبتدئ في الموضوع - وكانت عندما تظهر لي اخطاء - كنت احاول ان اكون مشروع جديد و ابدء من جديد.

بالنسبة للسؤال الاول - تاكد من IMyCalculator.cs

يجب ان يكون هكذا 

namespace MyCalcService{    [ServiceContract()]    public interface IMyCalculator    {         [OperationContract()]         int Add(int num1, int num2);    }}

واحدة من اسباب الخطأ في صورتك الاولى مثلا هو عدم وجود 

 [ServiceContract()]

بالنسبة لهذا السؤال 

لماذا كتبت SimpleCalculator   ولم تكتب مثلا أي أسم أخر ؟؟

 

قم بتغير الاسم كما تحب - لكن عليك ان تكتب نفس العنوان عند اضافة ال service للوصول اليها من برنامج ال client.

 

 

لماذا أقوم بعمل Interface  تسمي IMyCalculator

حيث البرنامج بدونها يعمل بلا مشكلة ؟؟؟

 

لم افهم ماذا تقصد بالضبط - لكن عموما لتكون service هناك اكثر من طريقة - لذا يمكنك من التغيير نوعا ما في البرنامج - لكن هناك اساسيات يجب ان تحافظ عليها.

 

بالنسبة للسؤال الاخير - لست متأكد من الخطأ - لكن يبدو انه لديك مشكلة في برنامج MyCalcServiceHost  والذي هو مسؤول عن عملية الاستضافة - الخطأ يقول انه ليس هناك entrypoint - وهذه المفروض مضافة عن طريق هذا السطر في برنامج الاستضافة.

 host.AddServiceEndpoint(typeof(MyCalcService.IMyCalculator), new WSHttpBinding(), "");

و لا توجد اي مشكلة اخي من الاسئلة - فهي تغني الموضوع ان شاء الله - وانا اجيب على قدر معلوماتي البسيطة لأني كما ذكرتُ انا مبتدئ و اتعلم واكتب الدروس في نفس الوقت.

 

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أعذرني اخي تيسير لعدم متابعتي الأيام السابقة .. ولكني ظروف العمل هي التي تمنعني .. وأعذرني ايضا في الأيام القليلة القادمة ..

 

ولكني سأتابع إن شاء الله وأقوم بتلخيص الدروس وعمل أمثلة إن شاء الله .. لتقوم سيادتكم بمراجعتها ..

 

وأعلم أخي الفاضل أن هذا الدرس مهم جدا لنا .. فأرجوك تابع ولا تتوقف ..

وجزاكم الله عنا خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي الكريم ... شكرا لك على موضوعك القيم 

لكن عندما قمت بتجريب البرنامج على الكمبيوتر الشخصي في وضعية localhost عمل بشكل ممتاز

لكن عندما يكون برنامج host على جهاز و احاول تفعيل الخدمه على جهاز اخر فأنها لاتعمل

ارجو الرد ولك جزيل الشكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مجهود مشكور عليه وصراحة شرح بسيط وعميق ويدل على خبرة في التدريس يمكن

على كلاً ماشاء الله نسأل الله ان يكتب في ميزان حسناتك

ان الله لايضيع اجر من احسن عملا

والشرح متسلسل وجميل ولكن الفترات متباعدة

 

استمر بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مجهود رائع جداً ، وبورك فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .