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的方法必须同时已经被声明为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]
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>