小结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包中得顺序,具体作用体现在等效数据契约上
/// <summary>
/// 学校编号
/// </summary>
[DataMember(Name = "Num", IsRequired = true, Order = 0)]
public string s_Num { get; set; }
/// <summary>
/// 学校名称
/// </summary>
[DataMember(Name = "Name", IsRequired = true, Order = 1)]
public string s_Name { get; set; }
/// <summary>
/// 学校地址
/// </summary>
[DataMember(Name = "Address", IsRequired = true, Order = 2)]
public string s_Address { get; set; }
/// <summary>
/// 建校时间
/// </summary>
[DataMember(Name = "DateTime", IsRequired = false, Order = 4)]
public DateTime s_DateTime { get; set; }
/// <summary>
/// 备注
///
/// 版本控制:
/// 若是此字段IsRequired为true的情况下,客户端没有给此字段赋值,则报一下错误:
/// 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://www.yoyozhu
/// 进行反序列化时出错: obj。InnerException 消息是“在行 1、位置 296 出现错误。
/// “EndElement”命名空间“http://www.yoyozhu”中的“obj”并非所需元素。所需
/// 元素应为“Description”。”。有关详细信息,请参阅 InnerException。若IsRequired
/// 为false,则客户端不会报错。同时,该字段会被赋予系统默认值
///
/// </summary>
[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 或从
* <serviceDebug> 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .
* NET Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志
*
* 客户端调用服务出现异常,客户端代码在出错的地方就反复调用服务端的该方法,不能跳过
*/
// DivideByZeroException exception = new DivideByZeroException();
// //throw new FaultException<DivideByZeroException>(exception,"arg2 = 0");
// throw new DivideByZeroException();
//}
//else
//{
// return arg1 / arg2;
//}
return arg1 / arg2;
}