在现代软件开发中,Web服务扮演着至关重要的角色,它们允许不同应用程序通过网络进行通信和数据交换。ASP.NET Web服务和Windows Communication Foundation (WCF)服务是两种在.NET框架中实现Web服务的技术。本文将探讨这两种技术的特点、使用场景以及它们之间的差异。
ASP.NET Web服务是一种可以通过标准Web协议访问的可编程应用程序逻辑。其中一种Web协议是简单对象访问协议(SOAP)。SOAP使用基于标准的技术(XML用于数据描述,HTTP用于传输)来编码和传输应用程序数据。
使用ASP.NET Web服务的消费者不需要了解服务的实现平台、对象模型或编程语言;他们只需要知道如何发送和接收SOAP消息(HTTP和XML)。
Windows Communication Foundation(WCF)是一个用于构建面向服务应用程序的框架。使用WCF,可以将数据作为异步消息从一个服务端点发送到另一个服务端点。服务端点可以是IIS托管的持续可用服务的一部分,也可以是应用程序中托管的服务。端点可以是请求服务端点数据的服务的客户端。消息可以简单到作为XML发送的单个字符或单词,也可以复杂到作为二进制数据流发送。
WCF服务适用于多种场景,包括但不限于:
WCF服务具有以下特点:
WCF是微软早期Web服务技术的替代品,它提供了比传统Web服务更广泛的远程通信功能。WCF的设计从一开始就旨在总结微软提供的不同的分布式编程基础设施。WCF的端点可以通过SOAP/XML轻松通信,也可以通过TCP/二进制通信,且更改通信介质只需修改配置文件。理论上,这减少了在移植或更改业务需求、目标等时所需的新代码量。
ASMX比WCF更早,ASMX能做的WCF都能做(而且更多)。基本上,可以将WCF视为尝试在微软的世界中逻辑地组合所有不同的应用程序通信方式;ASMX只是这些众多方式中的一种,现在被归入WCF的能力伞下。
ASP.NETWeb服务只能通过HTTP访问,并且工作在无状态环境中,而WCF服务则更加灵活,因为它可以在不同类型的应用程序中托管。常见的WCF服务托管场景包括IIS、WAS、自托管、托管Windows服务。
ASP.NET Web服务使用XmlSerializer将.NET类型序列化为XML。XmlSerializer有一些关键问题,例如只能序列化.NET类型的公共字段或属性,只能序列化实现IEnumerable接口的类,以及无法序列化实现IDictionary接口的类,如哈希表。
WCF使用DataContractSerializer,它在性能上优于XmlSerializer。DataContractSerializer的设计优势在于更好的性能,它明确显示了哪些字段或属性被序列化为XML,而XmlSerializer则没有明确指示。DataContractSerializer可以将哈希表转换为XML。
ASP.NETWeb服务的开发依赖于定义数据,并依赖于XmlSerializer将数据转换为服务。
[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服务契约,OperationContract属性指示接口的方法定义了服务契约的操作。实现服务契约的类在WCF中被称为服务类型。
ASP.NET Web服务被编译成类库程序集,服务文件具有.asmx扩展名,包含服务的代码。服务文件被复制到ASP.NET应用程序的根目录,程序集被复制到bin目录。应用程序可以通过服务文件的URL访问。
WCF服务可以在IIS或WindowsActivationService中托管。
将服务类型编译成类库,将具有.SVC扩展名的服务文件复制到虚拟目录,程序集复制到虚拟目录的bin子目录,将web.config文件复制到虚拟目录。
ASP.NET Web服务的客户端使用命令行工具WSDL.EXE生成。WCF使用ServiceMetadata工具(svcutil.exe)生成服务的客户端。
ASP.NETWeb服务中SOAP消息的头部可以自定义。WCF提供了MessageContractAttribute、MessageHeaderAttribute和MessageBodyMemberAttribute属性来描述SOAP消息的结构。
通过查询WSDL发出HTTP GET请求会导致ASP.NET生成描述服务的WSDL。它将WSDL作为请求的响应返回。生成的WSDL可以通过派生ServiceDescriptionFormatExtension类的类进行自定义。
对于.svc文件发出带有查询WSDL的请求会生成WSDL。WCF生成的WSDL可以通过使用ServiceMetadataBehavior类进行自定义。