65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 和 Web 服务有什么区别?

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (132投票s)

2010年12月26日

CPOL

6分钟阅读

viewsIcon

1090324

downloadIcon

38

ASP.NET Web 服务和编程 WCF 服务(类似于 ASP.NET Web 服务)之间的区别

引言

在本文中,我将解释 ASP.NET Web 服务和 WCF 服务(类似于 ASP.NET Web 服务)之间的区别。我还会讨论我们如何使用这两种技术来开发 Web 服务。

背景

ASP.NET 中的 Web 服务

Web 服务是通过标准 Web 协议访问的可编程应用程序逻辑。这些 Web 协议之一是简单对象访问协议 (SOAP)。SOAP 是 W3C 提交的备忘录(截至 2000 年 5 月),它使用基于标准的技​​术(XML 用于数据描述,HTTP 用于传输)来编码和传输应用程序数据。

Web 服务的消费者不需要了解服务实现所用的平台、对象模型或编程语言的任何信息;他们只需要了解如何发送和接收 SOAP 消息(HTTP 和 XML)。

WCF 服务

Windows Communication Foundation (WCF) 是一个用于构建面向服务的应用程序的框架。使用 WCF,您可以将数据作为异步消息从一个服务终结点发送到另一个。服务终结点可以是 IIS 托管的持续可用服务的一部分,也可以是应用程序中托管的服务。终结点可以是请求服务终结点数据的服务的客户端。消息可以简单到只发送一个字符或单词的 XML,也可以复杂到发送二进制数据流。

在什么场景下必须使用 WCF

  • 一个安全的服务来处理业务交易。
  • 一个向其他方提供实时数据的服务,例如交通报告或其他监控服务。
  • 一个允许两个人实时通信或交换数据的聊天服务。
  • 一个轮询一个或多个服务以获取数据并在逻辑上呈现它的仪表板应用程序。
  • 将使用 Windows Workflow Foundation 实现的工作流公开为 WCF 服务。
  • 一个 Silverlight 应用程序,用于轮询服务以获取最新的数据馈送。

WCF 的功能

  • 面向服务
  • 互操作性
  • 多种消息模式
  • 服务元数据
  • 数据协定
  • 安全
  • 多种传输和编码
  • 可靠消息和排队消息
  • 持久化消息
  • 事务
  • AJAX 和 REST 支持
  • 可扩展性

ASP.NET 中的 Web 服务与 WCF 服务之间的区别

WCF 是 Microsoft 所有早期 Web 服务技术的替代品。它还做了比传统上被认为是“Web 服务”的更多事情。

WCF 的“Web 服务”是 WCF 提供的更广泛的远程通信的一部分。与传统的 ASMX 相比,您将在 WCF 中获得更高程度的灵活性和可移植性,因为 WCF 从头开始设计,用于概括 Microsoft 提供的所有不同的分布式编程基础结构。WCF 中的终结点可以通过 SOAP/XML 以及 TCP/二进制轻松通信,并且更改此介质只需修改配置文件。理论上,这减少了在迁移或更改业务需求、目标等时所需的新代码量。

ASMX 比 WCF 旧,ASMX 能做的 WCF 都能做到(甚至更多)。基本上,您可以将 WCF 看作是尝试在 Microsoft 的世界中将获取两个应用程序进行通信的所有不同方式逻辑地分组在一起;ASMX 只是这些众多方式之一,因此现在被归入 WCF 的功能范围内。

Web 服务只能通过 HTTP 访问,并且在无状态环境中运行,而 WCF 则更加灵活,因为它的服务可以托管在不同类型的应用程序中。托管 WCF 服务的常见场景是 IIS、WAS、自托管、托管 Windows 服务。

主要区别在于 Web 服务使用 XmlSerializer。但 WCF 使用 DataContractSerializer,与 XmlSerializer 相比,它的性能更好。

XmlSerializer 在序列化 .NET 类型到 XML 时存在的主要问题

  • 只有 .NET 类型的 公共 字段或属性才能转换为 XML
  • 只有实现 IEnumerable 接口的类
  • 实现 IDictionary 接口的类,例如哈希表,无法序列化

DataContractSerializer 和 XMLSerializer 之间的重要区别

  • DataContractSerializer 设计的一个实际好处是比 Xmlserializer 性能更好。
  • XML 序列化不指示类型的哪些字段或属性被序列化到 XML 中,而 DataCotractSerializer
  • 明确显示了哪些字段或属性被序列化到 XML 中
  • DataContractSerializer 可以将 HashTable 转换为 XML

使用代码

ASP.NET Web 服务开发依赖于定义数据,并依赖 XmlSerializer 将数据转换进出服务。

XmlSerializer 在序列化 .NET 类型到 XML 时存在的主要问题

  • 只有 .NET 类型的 公共 字段或属性才能转换为 XML
  • 只有实现 IEnumerable 接口的类
  • 实现 IDictionary 接口的类,例如哈希表,无法序列化

WCF 使用 DataContractAttributeDataMemeberAttribute 将 .NET FW 类型转换为 XML。

[DataContract] 
public class Item 
{ 
    [DataMember] 
    public string ItemID; 
    [DataMember] 
    public decimal ItemQuantity; 
    [DataMember] 
    public decimal ItemPrice;
}

DataContractAttribute 可以应用于类或结构。DataMemberAttribute 可以应用于字段或属性,并且这些字段或属性可以是 公共私有 的。

DataContractSerializerXMLSerializer 之间的重要区别。

  • DataContractSerializer 设计的一个实际好处是比 XML 序列化性能更好。
  • XML 序列化不指示类型的哪些字段或属性被序列化到 XML 中,而 DataContractSerializer 则明确显示了哪些字段或属性被序列化到 XML 中。
  • DataContractSerializer 可以将 HashTable 转换为 XML。

开发服务

要使用 ASP.NET 开发服务,我们必须将 WebService 属性添加到类,并将 WebMethodAttribute 添加到任何类方法。

示例
[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 应用程序的根目录,Assembly 将被复制到 bin 目录。可以通过服务文件的 URL 访问该应用程序。

WCF 服务可以托管在 IIS 或 WindowsActivationService 中。

  • 将服务类型编译成类库
  • 将带有 .SVC 扩展名的服务文件复制到虚拟目录,并将程序集复制到虚拟目录的 bin 子目录。
  • web.config 文件复制到虚拟目录。

客户端开发

ASP.NET Web 服务的客户端使用命令行工具 WSDL.EXE 生成。

WCF 使用 ServiceMetadata 工具(svcutil.exe)来生成服务的客户端。

消息表示

SOAP 消息的头部可以在 ASP.NET Web 服务中自定义。

WCF 提供了 MessageContractAttributeMessageHeaderAttributeMessageBodyMemberAttribute 属性来描述 SOAP 消息的结构。

服务描述

发出带有查询 WSDL 的 HTTP GET 请求会导致 ASP.NET 生成 WSDL 来描述服务。它将 WSDL 作为响应返回。

可以通过派生 ServiceDescriptionFormatExtension 类来定制生成的 WSDL。

发出带有 .svc 文件查询 WSDL 的请求会生成 WSDL。WCF 生成的 WSDL 可以通过使用 ServiceMetadataBehavior 类来定制。

异常处理

在 ASP.NET Web 服务中,未处理的异常会作为 SOAP 故障返回给客户端。

在 WCF 服务中,未处理的异常不会作为 SOAP 故障返回给客户端。提供了一个配置设置,以便为了调试目的将未处理的异常返回给客户端。

历史

  • 2010年12月26日:初始发布

© . All rights reserved.