程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Learn WCF (2)--開發WCF服務

Learn WCF (2)--開發WCF服務

編輯:關於.NET

在上一篇中和大家復習了有關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服務就完成了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved