您的位置:首页 > 其它

数据契约(DataContract)

2010-06-09 09:36 351 查看
WCF第一要素就是契约:

服务契约用于声明可用于远程访问的类型。在Interface或class开始处使用服务契约标签.

[ServiceContract]

Public interface Iservice

{

}

接口调用契约的好处:

1. 同一服务类型可以实现多个不相干的服务契约.

2. 有利于版本升级

3. 按照接口隔离原则,让开发人员可以随时修改服务契约.

服务契约的属性与作用:

Name/Namespace定义该服务契约的自定义名称和命名空间,它会反映到WSDL及客户端的导出类中

ConfigurationName设置信息在配置文件中的名称。默认情况下为类的全名(本例为“WCFDemo.IService”)。

SessionMode服务契约的会话方式,允许的值有Allowed、NotAllowed和Required。默认为Allowed值。

CallbackContract设置双工通信时(Duplex)的回调类型。

ProtectionLevel指定消息保护模式,可以对通信的消息进行加密及签名。

使用参数时,例如要指定自定义的Name和 Namespace,可以编写如下的代码。

[ServiceContract(Name=”MyService”,Namespace=”http://microsoft.com/wcf/demo”)]

Interface IService{}

定义为服务契约的接口或类的方法可以被声明为OperationContract(操作契约),只有声明为操 作契约的方法才可以被远程调用

[ServiceContract]

Public interface Iservice

{

[OperationContract]

String SayHello(string name);

}

错误契约(FaultContract)

被标识为FaultContract的方法必须同时已经被声明为OperationContract,否则就没有什么意义。声明一个方法为 FaultContract并指定了响应的类型参数以后,当调用这个方法时产生错误时,就会有一个对应SOAP格式的错误消息返回给调用端

[DataContract]

public class UserFault //自定义错误类

{

[DataMember]

public string Message { get; set; }

[DataMember]

public int UserId { get; set; }

public UserFault(int userId, string msg)

{

this.UserId = userId;

this.Message = msg;

}

}

[ServiceContract]

public interface IUserService

{

[OperationContract]

[FaultContract(typeof(UserFault))]

UserInfo GetUser(int id);

}

public UserInfo GetUser(int id)

{

try{

UserInfo info = new UserInfo();

info.Age = 16;

info.UserName = "陈翔";

return info;

}

catch (Exception e)

{

throw new FaultException<UserFault>(new UserFault(id, e.Message));

}

}

数据契约(DataContract)

[DataContract]

public partial class Userinfo

{

private string _xsid = String.Empty;

/// <summary>

/// 学生编号

/// </summary>

[DataMember(Name="xsid")]

public string Xsid

{

get { return _xsid; }

set { _xsid = value; }

}

}

服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

一个类如果声明了DataContract类型,说明类是可以被传送的,且只有成员属性可以被传送.支持Name/Namespace属性[DataContract(Name=”Name”)]

每一个要传送的成员声明为DataMember类型,同样也可以包含Name,Namespace,IsRequired,Order,EmitDefaultvalue属性

需要传送SOAP消息时可以使用[MessageContract] eg:

[MessageContract]

public partial class Userinfo

{

private string _xsid = String.Empty;

private string _njid = String.Empty;

/// <summary>

/// 学生编号

/// </summary>

[MessageBodyMember(

Name="xsid"

Namespace=”http://www.smodi.com”)]

public string Xsid

{

get { return _xsid; }

set { _xsid = value; }

}

/// <summary>

/// 年级编号

/// </summary>

[MessageHeader(

Name="njid"

Namespace=”http://www.smodi.com”)]

public string Njid

{

get { return _njid; }

set { _njid = value; }

}

}

这个可以生成SOAP消息

<s:Envelope>

<s:Header>

<a:Action s:mustUnderstand="1">http:// Userinfo /Action</a:Action>

<h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.smodi.com">xxxx</h:AuthKey>

</s:Header>

<s:Body>

<UserMessage xmlns="Microsoft.WCF.Documentation">

<User xmlns="http://www.smodi.com">abcd</User>

</UserMessage>

</s:Body>

</s:Envelope>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: