您的位置:首页 > 运维架构

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

2007-12-17 11:07 513 查看
[索引页]
[源码下载]

[align=center]化零为整WCF(2) - 契约Contract(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)[/align]

作者:webabcd

介绍
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






{




    /**//// <summary>


    /// 人员管理接口


    /// </summary>


    // 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




    

{




        /**//// <summary>


        /// 获取某人的姓名


        /// </summary>


        /// <param name="p">Person对象</param>


        /// <returns></returns>


        // Name - 操作契约的名称(会对应到相关的wsdl,默认情况下本例为方法名“GetName”)


        [OperationContract(Name="GetPersonName")]


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


    }


}

PersonManager.cs


using System;


using System.Collections.Generic;


using System.Linq;


using System.Text;




using System.ServiceModel;


using System.Runtime.Serialization;




namespace WCF.ServiceLib.Contract






{




    /**//// <summary>


    /// 人员管理类


    /// </summary>


    public class PersonManager : IPersonManager




    

{




        /**//// <summary>


        /// 获取某人的姓名


        /// </summary>


        /// <param name="p">Person对象</param>


        /// <returns></returns>


        public string GetName(Person p)




        

{


             return "Name: " + p.Name;


        }


    }


}

Person.cs


using System;


using System.Collections.Generic;


using System.Linq;


using System.Text;




using System.ServiceModel;


using System.Runtime.Serialization;




namespace WCF.ServiceLib.Contract






{




    /**//// <summary>


    /// Person的实体类


    /// </summary>


    // Name - 数据契约的名称(会对应到相关的wsdl,默认情况下本例为类名“Person”)


    [DataContract(Name = "PersonModel")]


    public class Person




    

{




        /**//// <summary>


        /// Person的实体类的Age属性


        /// </summary>


        // Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“Age”)


        // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在


        // Order - 数据成员在相关的wsdl中的顺序


        // EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true


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




        public int Age 

{ get; set; }






        /**//// <summary>


        /// Person的实体类的Name属性


        /// </summary>


        // Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“Name”)


        // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在


        // Order - 数据成员在相关的wsdl中的顺序


        // EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true


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




        public string Name 

{ get; set; }


    }


}



Student.cs


using System;


using System.Collections.Generic;


using System.Linq;


using System.Text;




using System.ServiceModel;


using System.Runtime.Serialization;




namespace WCF.ServiceLib.Contract






{




    /**//// <summary>


    /// Student的实体类


    /// </summary>


    // Name - 数据契约的名称(会对应到相关的wsdl,默认情况下本例为类名“Student”)


    [DataContract(Name = "StudentModel")]


    public class Student : Person




    

{




        /**//// <summary>


        /// Student的实体类的School属性


        /// </summary>


        // Name - 数据成员的名称(会对应到相关的wsdl,默认情况下本例为属性名“School”)


        // IsRequired - 该值指示序列化引擎该成员在读取或反序列化时必须存在


        // Order - 数据成员在相关的wsdl中的顺序


        // EmitDefaultValue - 如果应该在序列化流中生成成员的默认值,则为 true,否则为 false,默认值为 true


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




        public string School 

{ get; set; }


    }


}



2、宿主
PersonManager.svc




<%

@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Contract.PersonManager" %>

Web.config


<?xml version="1.0"?>


<configuration>


  <system.serviceModel>


    <behaviors>


      <serviceBehaviors>


        <behavior name="ContractBehavior">


          <!--httpGetEnabled - 使用get方式提供服务-->


          <serviceMetadata httpGetEnabled="true" />


        </behavior>


      </serviceBehaviors>


    </behaviors>


    <services>


      <!--name - 提供服务的类名-->


      <!--behaviorConfiguration - 指定相关的行为配置-->


      <service name="WCF.ServiceLib.Contract.PersonManager" behaviorConfiguration="ContractBehavior">


        <!--address - 服务地址-->


        <!--binding - 通信方式-->


        <!--contract - 服务契约-->


        <endpoint address="" binding="basicHttpBinding" contract="ConfigurationNameTest" />


      </service>


    </services>


  </system.serviceModel>


</configuration>

3、客户端
PersonManager.aspx




<%

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


    Inherits="Contract_PersonManager" Title="契约(ServiceContract、OperationContract、DataContract、ServiceKnownType和DataMember)" %>




<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">


</asp:Content>


<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">


    <asp:TextBox ID="txtName" runat="server" Text="webabcd" />


     


    <asp:Button ID="btnGetName" runat="server" Text="GetName" 


        onclick="btnGetName_Click" />


</asp:Content>

PersonManager.aspx.cs


using System;


using System.Collections;


using System.Configuration;


using System.Data;


using System.Linq;


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();


    }


}



Web.config


<?xml version="1.0"?>


<configuration>


  <system.serviceModel>


    <client>


      <!--address - 服务地址-->


      <!--binding - 通信方式-->


      <!--contract - 服务契约-->


      <endpoint address="http://localhost:3502/ServiceHost/Contract/PersonManager.svc" binding="basicHttpBinding" contract="Contract.IPersonManager" />


    </client>


  </system.serviceModel>


</configuration>

运行结果:

单击"btnGetName"后弹出提示框,显示"Name: webabcd"

OK
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wcf binding server 引擎 asp c#