مثال بسيط علي انشاء WCF Service الجزء الثالث


·         انشاء WCF Client Application  

-          من Solution Explorer  قم باضافة Project جديد من النوع Console Application  باسم BirthdayClient

-          من Solution Explorer  قم باضافة مرجع Add Reference  الي System.ServiceModel assembly  الي BirthdayClient Project بالضغط بالزر الايمن للماوس عليه ثم اختيار Add Reference

-          ايضا قم باضافة  Service Reference  بالضغط بالزر الايمن للماوس علي BirthdayClient  ثم اختار Add Service Reference  ومن الصفحة التي ستظهر قم بالضغط علي Discover  ليقوم بالبحث عن الـ Service  المتوفرة لتظهر لك Service  التي انتهينا من انشائها قم بالضغط عليها وفي اسف الصفحة في مريع النص Name Space  قم بتغير الاسم الي BirthdayService ثم قم بالضغط  علي Ok كما بالشكل


-          بالتوجه App.config  في BirthdayClient   وفتحه ليظهر الكود سوف تجد ان WCF Service  قامت بعمل تهيئة الاتصال بالـ Service  كما بالكود التالي

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IBirthdayService" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:12516/Service.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IBirthdayService" contract="BirthdayService.IBirthdayService"
                name="BasicHttpBinding_IBirthdayService" />
        </client>
    </system.serviceModel>
</configuration>

-          ستجد في الجزء الخاص بالـ <client> تحديد طريقة الاتصال بـ Service  في <endpoint> يوجد معلومات الاتصال وهي تتكوت من 3 اجزاء address , binding , contract

-          الان قم بفتح Program.cs  ثم قم باضافة المراجع الاتية

using System.ServiceModel;
using BirthdayClient.BirthdayService;

-          في Main method  قم بانشاء New Instance  من BirthdayService  ليصبح الكود كالاتي

static void Main(string[] args)
        {
            BirthdayServiceClient proxy = new BirthdayServiceClient();

        }
-          الان يمكنك استخدام Service Method  التي انشائنها من قبل والاتي هو مثال استخدام  ListFirstName() Method

static void Main(string[] args)
        {
            BirthdayServiceClient proxy = new BirthdayServiceClient();

            Console.WriteLine("Now The Console will Write All First Name");
            string[] info = proxy.ListFirstName();

            foreach (string name in info)
            {
                Console.WriteLine(name);
            }

            proxy.Close();
            Console.ReadKey();

        }

-          قبل ان تقوم باختبار الـ Client Project   يجب عليك وضع الـ Startup Projects  بالضغط علي الـ Sultion (BirthdayService) بالزر الايمن للماوس واختيار Set Startup Projects

-          من الصفحة التي ستظهر قم باختيار Multiple startup projects وقم بتحديد الـ Projacts  الاتية باختيار Start كما بالشكل


-          بعد التحديد والضغط علي Ok  قم بالضغط علي Ctrl + F5  للاختبار كما بالشكل



-          الي هنا نكون قد انتهينا من هذا الجزء في الجزء القادم سوق اقوم بشرح كيف تقوم بعمل deploying  للـ Service  علي IIS   (Internet Information Services)

مثال بسيط علي انشاء WCF Service الجزء الثاني


بعد انشاء Entity Model  الان سنقوم بانشاء WCF service
    -          من Solution Explorer  قم بالضغط بالزر الايمن للماوس واختار Add >> New Web Site  ومن الصفحة التي ستظهر قم باختيار WCF service


    -          باختيارك WCF Service Template   سيتم انشاء WCf  كـ جزء من   Web Application في App_Code   فولدر ستجد IService.cs Interface   و ايضا Service.cs Class وبالنظر الي Service.cs سوف تجد ان WCF Service Template  اضاف المراجع العادية واضاف المراجع التي سيتم استخدامها في WCF Service  وهي System.ServiceModel , System.ServiceModel.Web , System.Runtime.Serialization  كما بالشكل




     -          الـ System.ServiceModel تحتوي Classes  التي ستستخدمها WCF  لتحدد Service  والعمليات وبالطبع فأن System.Runtime.Serialization  تستخدم لتحويل Objects  الي Stream Of Data   لنقلها عن طريق Network  والمعروفة باسم serialization وايضا تستخدم لعكس العملية بمعني تحويل Stream  الي objects  والمعروفة بأسم deserialization

     -          بالنظر الي الكود ستجد ان هناك 2 methods وهي GetData و GetDataUsingDataContract وقد تم ادراجاهم من IService Interface  

     -          بفتح IService.cs  من App_Code كما بالشكل الاتي والنظر الي الكود





 ستجد ان Iservice  تحتوي علي 2 methods والتي تم تنفذهم في Service.cs Class   وهما GetData , GetDataUsingDataContract  والمعروفين باسم service contract ويتم تعرفيهم عن طريق استخدام attributes كما بالشكل السابق وهما [ServiceContract] و [OperationContract]   .
ايضا ستجد  Class  باسم CompositeType  وهي Type Returned   عن طريق GetDataUsingDataContract Method   والتي تستخدم attributes [DataContract] و [DataMember] وهي عبارة مثال للـ data contract وساقوم بتوضيحها .

أ - انشاء interfaces او Contracts الخاصة بهذا المثال والتي سيتم تنفيذيها في Sevice.cs  

    ·         تحديد الـ Datacontarct

      -          قم بفتح IService.cs واحذف كل الكود ما عدا المراجع  ( using statement )

      -          من Solution Explorer  قم بتغير اسم IService.cs الي IBirthdayService.cs

      -          قم باضافة Name Space  بأسم Birthday كالاتي

namespace Birthday
{

}
      -          قم بانشاء Class باسم Birthday  وحدد بها الـ member المستخدمة في ال Entity Model

    [DataContract]
    public class BirthdayData
    {
        [DataMember]
        public string FirstName;

        [DataMember]
        public string LastName;

        [DataMember]
        public DateTime birthdayDate;

     }
      -          بوضع الـ attribute   [DataContract] فاننا نحدد ان هذه الـ Class  ستستخدم serialized و deserialized كـ XML Stream  بواسطة WCF  يمكنك استخدام [DataContract] attribute في classes, structures, enumerations

      -          يجب ان تضع [DataMember] attribute   علي كل member  في الـ Class  اذا كنت تريد ان يتم عليه عملية serialized

·         تحديد الـ service contract

      -          قم باضافة IBirthdayService interface بعد BirthdayData Class وحدد بها العمليات التي سيتم استخدامها كالاتي

[ServiceContract]
    public interface IBirthdayService
    {
       //Return all FirstName
        [OperationContract]
        List<string> ListFirstName();

        //Return FullData by FirstName
        [OperationContract]
        BirthdayData GetFullInfo(string firstName);


    }

ب -  تنفيذ Service

الان بعد تحديد serviceContract  في   IBirthdayService interface سنقوم بتنفيذ الـ mothod   التي بها .
-          قم باضافة مرجع الي BirthdayEntityModel project بالذهاب الي الـ Birthdayservice Projact  في الـ Solution Explorer  قم بالضغط بالزر الايمن للماوس ثم قم بالضغط علي Add Reference من القائمة علي الشمال اختار Projacts  ثم قم باختيار Entity Model  واضغط Ok كما ف الشكل



     -          قم باضافه مرجع الي System.Data.Entity بعمل نفس الخطوات السابقة في الاضافة ومن القائمة علي الشمال قم باختار Assemblis  ومنها اختار framework  ثم قم باستخدام مربع البحث علي اليمن كما بالشكل ثم قم بتعليم checkbox  الذي سيظهر كما بالشكل



     -          بالذهاب App_Code  فولدر قم بتسمية Service.cs  الي BirthdayService.cs ثم قم بفتحها

     -          الان قم بحذف كل الكود ما عدا المراجع  ( using statement )

     -          قم باضافة مرجع الي BirthdayModel  باستخدام using BirthdayEntityModel;

     -          قم باضافة Birthday name space  

namespace Birthday
{

}
     -          قم باضافة Class  وقم بتسميتها  BirthdayServiceImplement  ثم قم بعمل inheritance للـ IBirthdayService كالاتي

namespace Birthday
{
    public class BirthdayServiceImplement : IBirthdayService
    {

    }
}
      -      الان يمكنك تضمين الـ methods  في IBirthdayService  بالوقوف عليها والضغط بالزر الايمن للماوس ثم اختيار Implement Interface  كما البشكل




     -          الان سوف نقوم باضافة الكود الي الـ method   ListFirstName()  ليكون كالاتي

public List<string> ListFirstName()
        {
            List<string>  FirstNameList = new List<string>();

            using (birthdaydbEntities db = new birthdaydbEntities())
            {
                var firstname = from birthday in db.BirthDays
                                select birthday.FirstName;
               FirstNameList = firstname.ToList();
            }

            return FirstNameList;
        }

      -          بعد اضافة الكود للـ method  الاولي سنقوم باضافة الكود للـ method  الثانية ليكون كالاتي

  public BirthdayData GetFullInfo(string firstName)
        {
            BirthdayData birthdayData = null;
            using (birthdaydbEntities db = new birthdaydbEntities())
            {
                BirthDay findInfo = db.BirthDays.First(b => string.Compare(b.FirstName, firstName) == 0);

                birthdayData = new BirthdayData()
                {
                    FirstName = findInfo.FirstName,
                    LastName = findInfo.LastName,
                    birthdayDate = findInfo.birthdayDate
                };
            }

            return birthdayData;
        }

·         تهيئة WCF Service

الان يجب تيهئة Service  وذلك بربطها بـ Birthday.cs الذي انتهينا منه في الخطوة السابقة

      -          بالذهاب الي Service.svc  من Solution Explorer   نقوم بالضغط عليها مرتين ليظهر لنا الكود الاتي

<%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>

     -          نقوم بتعديل الكود وتحديد اسم Service  التي تم تغيرخ ليصبح الكود كالاتي

<%@ ServiceHost Language="C#" Debug="true" Service="Birthday.BirthdayServiceImplement" CodeBehind="~/App_Code/Birthday.cs" %>


     -          قم بالذهاب App.Config  للـ BirthdayEntityModel وقم بنسخ النص الاتصال منه ومن المفترض ان يكون بهذا الشكل

<connectionStrings>
    <add name="birthdaydbEntities" connectionString="metadata=res://*/BirthdayModel.csdl|res://*/BirthdayModel.ssdl|res://*/BirthdayModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\MSSQlExpress;initial catalog=birthdaydb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

    -          الان قم بالذهاب الي WCf Service  من الـ Solution Explorer  ثم قن بفتح Web.config وقم باضافة نص الاتصال الذي قمت بنسخة في جزء  <configuration> وقبل <system.web>  ليكون الشكل النهائي للكود في Web.config كالاتي

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <connectionStrings>
    <add name="birthdaydbEntities" connectionString="metadata=res://*/BirthdayModel.csdl|res://*/BirthdayModel.ssdl|res://*/BirthdayModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\MSSQlExpress;initial catalog=birthdaydb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="false" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

       -          الان قم بحفظ Web.config ثم قم بالذهاب الي Service.svc وقم بالضغط عليها بالزر الايمن للماوس ثم قم باختيار View in Browser كما بالشكل


      -          سوف تظهر لك الـ help page  للـ WCF Service   للتأكد من تهيئة Service  بشكل صحيح  كما بالشكل الاتي



   -          الي هنا نكون انتهينا من الجزء الثاني في الجزء القادم ساقوم بانشاء Clint application  .