天天看點

化零為整WCF(2) - 契約Contract(ServiceContract、OperationContract、DataContract

<a href="http://webabcd.blog.51cto.com/1787395/343999" target="_blank">[索引頁]</a>

化零為整WCF(2) - 契約Contract(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)

介紹

WCF(Windows Communication Foundation) - 契約(Contract):服務契約(ServiceContract),操作契約(OperationContract),資料契約(DataContract),服務已知類型(ServiceKnownType),資料成員(DataMember)。

示例

1、服務

IPersonManager.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.ServiceModel; 

using System.Runtime.Serialization; 

namespace WCF.ServiceLib.Contract 

        /// &lt;summary&gt; 

        /// 人員管理接口 

        /// &lt;/summary&gt; 

        // Namespace - 服務契約的命名空間 

        // Name - 服務契約的名稱(會對應到相關的wsdl,預設情況下本例為接口名“IPersonManager”) 

        // ConfigurationName - 服務契約在宿主中所配置的服務名稱(預設情況下本例為類的全名“WCF.ServiceLib.Contract.IPersonManager”) 

        [ServiceContract(Namespace = "http://webabcd.cnblogs.com", Name = "IPersonManager", ConfigurationName = "ConfigurationNameTest")] 

        // 服務已知類型 - Student(資料契約)繼承自Person(資料契約),要指定Student為已知類型,其才會被序列化 

        [ServiceKnownType(typeof(Student))] 

        public interface IPersonManager 

        { 

                /// &lt;summary&gt; 

                /// 擷取某人的姓名 

                /// &lt;/summary&gt; 

                /// &lt;param name="p"&gt;Person對象&lt;/param&gt; 

                /// &lt;returns&gt;&lt;/returns&gt; 

                // Name - 操作契約的名稱(會對應到相關的wsdl,預設情況下本例為方法名“GetName”) 

                [OperationContract(Name="GetPersonName")] 

                string GetName([MessageParameter(Name = "person")] Person p); 

        } 

}

PersonManager.cs

        /// 人員管理類 

        public class PersonManager : IPersonManager 

                public string GetName(Person p) 

                { 

                         return "Name: " + p.Name; 

                } 

Person.cs

        /// Person的實體類 

        // Name - 資料契約的名稱(會對應到相關的wsdl,預設情況下本例為類名“Person”) 

        [DataContract(Name = "PersonModel")] 

        public class Person 

                /// Person的實體類的Age屬性 

                // Name - 資料成員的名稱(會對應到相關的wsdl,預設情況下本例為屬性名“Age”) 

                // IsRequired - 該值訓示序列化引擎該成員在讀取或反序列化時必須存在 

                // Order - 資料成員在相關的wsdl中的順序 

                // EmitDefaultValue - 如果應該在序列化流中生成成員的預設值,則為 true,否則為 false,預設值為 true 

                [DataMember(Name = "PersonAge", IsRequired = false, Order = 1)] 

                public int Age { get; set; } 

                /// Person的實體類的Name屬性 

                // Name - 資料成員的名稱(會對應到相關的wsdl,預設情況下本例為屬性名“Name”) 

                [DataMember(Name = "PersonName", IsRequired = false, Order = 0)] 

                public string Name { get; set; } 

Student.cs

        /// Student的實體類 

        // Name - 資料契約的名稱(會對應到相關的wsdl,預設情況下本例為類名“Student”) 

        [DataContract(Name = "StudentModel")] 

        public class Student : Person 

                /// Student的實體類的School屬性 

                // Name - 資料成員的名稱(會對應到相關的wsdl,預設情況下本例為屬性名“School”) 

                [DataMember(Name = "School", IsRequired = false, Order = 0)] 

                public string School { get; set; } 

2、宿主

PersonManager.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Contract.PersonManager" %&gt;

Web.config

&lt;?xml version="1.0"?&gt; 

&lt;configuration&gt; 

    &lt;system.serviceModel&gt; 

        &lt;behaviors&gt; 

            &lt;serviceBehaviors&gt; 

                &lt;behavior name="ContractBehavior"&gt; 

                    &lt;!--httpGetEnabled - 使用get方式提供服務--&gt; 

                    &lt;serviceMetadata httpGetEnabled="true" /&gt; 

                &lt;/behavior&gt; 

            &lt;/serviceBehaviors&gt; 

        &lt;/behaviors&gt; 

        &lt;services&gt; 

            &lt;!--name - 提供服務的類名--&gt; 

            &lt;!--behaviorConfiguration - 指定相關的行為配置--&gt; 

            &lt;service name="WCF.ServiceLib.Contract.PersonManager" behaviorConfiguration="ContractBehavior"&gt; 

                &lt;!--address - 服務位址--&gt; 

                &lt;!--binding - 通信方式--&gt; 

                &lt;!--contract - 服務契約--&gt; 

                &lt;endpoint address="" binding="basicHttpBinding" contract="ConfigurationNameTest" /&gt; 

            &lt;/service&gt; 

        &lt;/services&gt; 

    &lt;/system.serviceModel&gt; 

&lt;/configuration&gt;

3、用戶端

PersonManager.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PersonManager.aspx.cs" 

        Inherits="Contract_PersonManager" Title="契約(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&gt; 

&lt;/asp:Content&gt; 

&lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;asp:TextBox ID="txtName" runat="server" Text="webabcd" /&gt; 

        &lt;asp:Button ID="btnGetName" runat="server" Text="GetName"    

                 /&gt; 

&lt;/asp:Content&gt;

PersonManager.aspx.cs

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Xml.Linq; 

public partial class Contract_PersonManager : System.Web.UI.Page 

        protected void Page_Load(object sender, EventArgs e) 

        protected void btnGetName_Click(object sender, EventArgs e) 

                // Contract.IPersonManager pm = new Contract.PersonManagerClient(); 

                Contract.PersonManagerClient proxy = new Contract.PersonManagerClient(); 

                Contract.StudentModel sm = new Contract.StudentModel() { PersonName = txtName.Text }; 

                Page.ClientScript.RegisterStartupScript( 

                        this.GetType(), 

                        "js", 

                        string.Format("alert('{0}')", proxy.GetPersonName(sm)), 

                        true); 

                proxy.Close(); 

        &lt;client&gt; 

            &lt;!--address - 服務位址--&gt; 

            &lt;!--binding - 通信方式--&gt; 

            &lt;!--contract - 服務契約--&gt; 

            &lt;endpoint address="http://localhost:3502/ServiceHost/Contract/PersonManager.svc" binding="basicHttpBinding" contract="Contract.IPersonManager" /&gt; 

        &lt;/client&gt; 

運作結果:

單擊"btnGetName"後彈出提示框,顯示"Name: webabcd"

OK

<a href="http://down.51cto.com/data/100781" target="_blank">[源碼下載下傳]     </a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344106,如需轉載請自行聯系原作者

繼續閱讀