مثال بسيط علي انشاء 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  .