بعد انشاء 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();
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="data source=.\MSSQlExpress;initial catalog=birthdaydb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=.\MSSQlExpress;initial catalog=birthdaydb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 .