我认识的wcf和web service之间的区别
介绍
解释WCF和 asp.net web service之间的区别和联系.在使用开发实现asp.net web service的时候我们主要依靠的是XmlSerializer来把数据对象转化为xml的.
在使用XmlSerializer来序列化.net类型为xml的时候需注意一下几点:
a) 只有public的字段或者属性才能够被解析为xml.
b) 类必须实现IEnumerable的接口.
c) 那些实现了IDictionary接口的类型不能够解析为xml,例如Hash table.
[DataContract] public class Item { [DataMember] public string ItemID; [DataMember] public decimal ItemQuantity; [DataMember] public decimal ItemPrice; }
而WCF是使用DataContractAttribute和DataMemberAttribute这两个属性类来把.net下的类型解释为xml的.
DataContractAttribute属性类能够运用在类和结构上.DataMemberAttribute运用在字段和property上.而这些Field和property能够是public或者private的.
DataContractAttribute和XmlSerializer之间的只要区别
a) DataContractAttribute在设计上要比XmlSerializer有更好的性能.
b) 在序列化数据对象类的时候,XmlSerializer不能够对具体的字段区别对待.而DataContractAttribute能够显式表示那些字段和属性需要内序列化.
c) DataContractAttribute能够解析Hashtable为xml.
开发Service
在开发asp.net web service 的时候我们必须在类上添加WebService属性和在方法上添加WebMethod属性.
Example
[WebService] public class Service : System.Web.Services.WebService { [WebMethod] public string Test(string strMsg) { return strMsg; } }
在开发WCF的时候我们需要这样:
[ServiceContract] public interface ITest { [OperationContract] string ShowMessage(string strMsg); } public class Service : ITest { public string ShowMessage(string strMsg) { return strMsg; } }
首先我们需要写一个接口,这个接口被ServiceContractAttribute修饰.它说明了这个接口定义了一个WCf 服务的契约.接口的方法都被OperationContractAttribute所修饰,它说明了这些方法都是服务契约的操作.
实现了这个接口的类就看做是WCF里的服务类.
服务宿主
Asp.net web service被编译成了一个dll和一个.asmx文件,这个服务文件在应用程序的根目录下.dll在bin文件夹里,我们通过url来访问服务.
WCF服务可以寄宿在IIS或者WindowsActionService.
a) 编译服务类为一个类库.
b) .SVC服务类文件复制到虚拟目录根目录,程序集复制到bin子目录.
c) 复制web.config文件到虚拟目录的根目录.
客户端开发
ASP.NET Web services通过命令行工具wsdl.exe来生成客户端代码.WCF使用ServiceMetadata tool(svcutil.exe)来生成客户端代码.
消息表述
在ASP.NET Web services中,SOAP消息的头可以自定义,在WCF服务中提供了MessageContractAttribute , MessageHeaderAttribute 和 MessageBodyMemberAttribute来描述soap消息的结构.
服务描述
asp.net接收到一个wsdl描述的get请求时,同样会返回一个wsdl描述的响应.可以通过继承自ServiceDescriptionFormatExtension类来自定义wsdl.
当wcf接收到一个wsdl的请求时,wcf可以使用继承自ServiceMetadataBehavior这个类来自定义返回的wsdl响应.
异常处理
在ASP.NET Web services中,不被处理的异常将会给客户端返回一个soap错误.在wcf 服务中,在遇到不被处理的异常时不会返回soap错误,可以通过配置文件来处理这些异常,能够给客户端发送一些有助于调试的响应.
基本上可以说有下面几点关于在使用这两个服务时的选择:
- Wcf更加标准一点比起asp.net web service.
- Wcf可以支持HTTP,TCP,MSMQ,WS-HTTP 等的这些协议.而asp.net web service只支持http.
- Wcf能够像com+那样处理事务
- Wcf已经集成了Json
- Wcf可以寄宿在IIS或者WAS.
- Asp.net web service没有实例管理功能.例如你不能够有单例的service或者事务管理.