在上一篇中和大家復習了有關WCF的一些基礎知識,這篇通過實例和大家分享如何開發一個獲取,添加學生信息的WCF服務。
開發WCF服務的端點需要涉及下面幾個任務:
開發服務契約:指定端點可用的WCF服務的操作。
開發綁定:綁定指點端點與外界通信的協議。
添加,刪除,更新和配置端點:在配置文件中添加和綁定端點(當然也可以用編碼的形式,但是不推薦。)
添加行為:一個行為就是一個組件,能增強服務,端點,和操作的運行時行為。
開發一個WCF服務契約
一個WCF服務契約是一個用元數據屬性[ServiceContract]修飾的.NET接口或類。每個WCF服務可以有一個或多個契約,每個契約是一個操作集合。
首先我們定義一個.NET接口:IStuServiceContract,定義兩個方法分別實現添加和獲取學生信息的功能
void AddStudent(Student stu);stuCollection GetStudent();
用WCF服務模型的元數據屬性ServiceContract標注接口IStuServiceContract,把接口設計為WCF契約。用OperationContract標注AddStudent,GetStudent
GetStudent()返回一個類型為stuCollection類型的集合。AddStudent()需要傳入Student實體類作為參數。
namespace WCFStudent
{
[ServiceContract]
public interface IStuServiceContract
{
[OperationContract]
void AddStudent(Student stu);
[OperationContract]
stuCollection GetStudent();
}
[DataContract]
public class Student
{
private string _stuName;
private string _stuSex;
private string _stuSchool;
[DataMember]
public string StuName
{
get { return _stuName; }
set { _stuName = value; }
}
[DataMember]
public string StuSex
{
get { return _stuSex; }
set { _stuSex = value; }
}
[DataMember]
public string StuSchool
{
get { return _stuSchool; }
set { _stuSchool = value; }
}
}
public class stuCollection : List<Student>
{
}
}
WCF服務和客戶交換SOAP信息。在發送端必須把WCF服務和客戶交互的數據串行化為XML並在接收端把XML反串行化。因此客戶傳遞給AddStudent操作的Student對象也必須在發送到服務器之前串行化為XML。WCF默認使用的是一個XML串行化器DataContractSerializer,用它對WCF服務和客戶交換的數據進行串行化和反串行化。
作為開發人員,我們必須要做的是用元數據屬性DataContract標注WCF和其客戶所交換的數據的類型。用元數據屬性DataMember標注交換數據類型中要串行化的屬性。(詳細看上面的代碼)
實現WCF服務契約
實在一個WCF服務契約就行寫一個類一樣容易,這裡我們先創建一個處理Student的類。StudentManage
namespace WCFStudent
{
public static class StudentManage
{
private static DataTable TD_stu;
static StudentManage()
{
TD_stu = new DataTable();
TD_stu.Columns.Add(new DataColumn("Name"));
TD_stu.Columns.Add(new DataColumn("Sex"));
TD_stu.Columns.Add(new DataColumn("School"));
}
public static void AddStudent(string name, string sex, string school)
{
DataRow row = TD_stu.NewRow();
row["Name"] = name;
row["Sex"] = sex;
row["School"] = school;
TD_stu.Rows.Add(row);
}
public static IEnumerable GetStudent()
{
return TD_stu.DefaultView;
}
}
}
接下來創建一個類WCFStudentText,實現接口IStuServiceContract
namespace WCFStudent
{
public class WCFStudentText:IStuServiceContract
{
public WCFStudentText()
{
//
//TODO: 在此處添加構造函數邏輯
//
}
public void AddStudent(Student stu)
{
StudentManage.AddStudent(stu.StuName, stu.StuSex, stu.StuSchool);
}
public stuCollection GetStudent()
{
IEnumerable list = StudentManage.GetStudent();
stuCollection stucollect = new stuCollection();
Student stu;
IEnumerator iter = list.GetEnumerator();//通過GetEnumerator方法獲得IEnumerator對象的引用
bool first = true;
PropertyDescriptorCollection pds = null;
while (iter.MoveNext())//用IEnumerator對象對存儲在IEnumerator集合中的Student信息進行迭代,每一個PropertyDescriptor都是一個學生的信息
{
if (first)
{
first = false;
pds = TypeDescriptor.GetProperties(iter.Current);
}
stu = new Student();
stu.StuName = (string)pds["Name"].GetValue(iter.Current);
stu.StuSex = (string)pds["Sex"].GetValue(iter.Current);
stu.StuSchool = (string)pds["School"].GetValue(iter.Current);
stucollect.Add(stu);
}
return stucollect;
}
}
}
用IEnumerator對象對存儲在IEnumerator集合中的Student信息進行迭代,每一個PropertyDescriptor都是一個學生的信息。
駐留WCF服務
添加一個ADO.NET數據服務文件WCFStudentText.svc,並修改文件的內容為:
<%@ ServiceHost Service="WCFStudent.WCFStudentText"%>
最後我們要做的就是修改Web.config文件:
<system.serviceModel>
<services>
<service name="WCFStudent.WCFStudentText" behaviorConfiguration="ServiceBehavior">
<!-- Service Endpoints -->
<endpoint address="" binding="wsHttpBinding" contract="WCFStudent.IStuServiceContract">
<!--
部署時,應刪除或替換下列標識元素,以反映
在其下運行部署服務的標識。刪除之後,WCF 將
自動推導相應標識。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
將WCF服務的名稱設為WCFStudent.WCFStudentText,WCF服務端點(EndPoint)的服務契約設定為我們所編寫的契約WCFStudent.IStuServiceContract
當然我們可以用VS2008直接創建WCF工程,將會給我們帶來很多方便。
這樣,一個WCF服務就完成了。