WCF学习笔记(四)数据契约、版本控制、错误

小结1.

/*
     DataContract:但凡自定义数据类型,都要使用此标记标示该类型,用于序列化。
       WCF:C/S间传递数据的过程:C端将传入参数序列化后包含在消息中,S端收到消息
     * 使用反射反序列化参数,转换成本地CLR类型,执行相关操作,序列化传出参数,C
     * 端收到消息后反序列化该参数,再次转换成本地类型。
     */
    [DataContract]
    public class Class_School
    {
        //这是序列化事件。当WCF开始序列化类型时会自动调用此方法.
        //注意此方法需要和序列化事件名称相同
      
    }

    //注意:这里的继承类也要有DataContract标记
    [DataContract]
    public class Class_SchoolEx : Class_School
    {
        //这是序列化事件。当WCF开始序列化类型时会自动调用此方法.
        //注意此方法需要和序列化事件名称相同
        [OnSerializing]
        void OnSerializing(StreamingContext context)
        { }

        //SqlConnection s = new SqlConnection();
        //DataSet
           
    }

    //[Serializable]标记会将所有可读写字段序列化
    [Serializable]
    public struct Struct_School
    {
        /*结构也有公私成员
         *
         *默认情况下,以下成员都不会被序列化;必须显式加上datamember标记
         *datamember通常使用在属性上,此时,这里的共有成员若是没有使用get
         *set访问器,就会报InvalidDatacontractException异常.
         *如果类上使用了DataContract标记,则其所有的成员都被默认使用datamember
         *若是类上没有使用DataContract标记,.NET会去做契约推断。此方式不推荐。
         *
         */
        [DataMember]
        public string s_SchoolNum { get; set; }
        public string s_SchoolName { get; set; }

        [DataMember]
        public Class_School c_School;
    }

小结2.版本控制

[DataContract(Name="School",Namespace="http://schemas.yoyo.zhu")]
    public class School
    {
        //IsRequired:的意思是该字段是否需要赋值后才能序列化
        //Order:的意思是这些字段在SOAP包中得顺序,具体作用体现在等效数据契约上

        ///


        /// 学校编号
        ///

        [DataMember(Name = "Num", IsRequired = true, Order = 0)]
        public string s_Num { get; set; }
        ///
        /// 学校名称
        ///

        [DataMember(Name = "Name", IsRequired = true, Order = 1)]
        public string s_Name { get; set; }
        ///
        /// 学校地址
        ///

        [DataMember(Name = "Address", IsRequired = true, Order = 2)]
        public string s_Address { get; set; }
        ///
        /// 建校时间
        ///

        [DataMember(Name = "DateTime", IsRequired = false, Order = 4)]
        public DateTime s_DateTime { get; set; }
        ///
        /// 备注
        ///
        /// 版本控制:
        /// 若是此字段IsRequired为true的情况下,客户端没有给此字段赋值,则报一下错误:
        /// 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://www.yoyozhu
        /// 进行反序列化时出错: obj。InnerException 消息是“在行 1、位置 296 出现错误。
        /// “EndElement”命名空间“http://www.yoyozhu”中的“obj”并非所需元素。所需
        /// 元素应为“Description”。”。有关详细信息,请参阅 InnerException。若IsRequired
        /// 为false,则客户端不会报错。同时,该字段会被赋予系统默认值
        ///
        ///

        [DataMember(Name = "Description", IsRequired = false, Order = 3)]
        public string s_Description { get; set; }
    }

小结3.服务错误

 public int Divide(int arg1, int arg2)
        {
            //if (arg2 == 0)
            //{
            /*
             * WCF中的异常应该是平台无关性的,这样的异常的表现形式就是SOAP错误
             * FaultException就是SOAP错误;此时服务端的错误和客户端的错误信息一致
             *
             * 若是不使用faultexcepton,客户端将报一下错误:
             * 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的
             * IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从
             * 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .
             * NET Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志
             *
             * 客户端调用服务出现异常,客户端代码在出错的地方就反复调用服务端的该方法,不能跳过
             */

            //    DivideByZeroException exception = new DivideByZeroException();
            //    //throw new FaultException(exception,"arg2 = 0");
            //    throw new DivideByZeroException();
            //}
            //else
            //{
            //    return arg1 / arg2;
            //}

            return arg1 / arg2;
        }

你可能感兴趣的:(WCF)