WCF Web 编程模型概述

Web 编程模型提供使用 Windows Communication Foundation (WCF) 生成 Web 样式服务所需的基本框架元素。Web 样式服务旨在提供给最大范围的可能客户端(包括不带有附加客户端框架的 Web 浏览器)访问,并且具有以下独特要求:

  • URI 和 URI 处理。URI 在 Web 样式服务的设计中扮演一个中心角色。WCF Web 编程模型使用 UriTemplateUriTemplateTable 类来提供 URI 处理功能。
  • 支持 GET 和 POST 操作。除了使用各种调用谓词来进行数据修改和远程调用之外,Web 样式服务还使用 GET 谓词进行数据检索。Web 编程模型使用 WebGetAttributeWebInvokeAttribute 将服务操作与 GET 和 POST 两个谓词相关联。
  • 多种数据格式。Web 样式服务除了处理 SOAP 消息之外,还可处理很多种数据。Web 编程模型使用 WebHttpBindingWebHttpBehavior 来支持很多不同的数据格式,其中包括 XML 文档、JSON 数据对象和二进制内容(例如图像、视频文件或纯文本)的流。

Web 编程模型将 WCF 扩展到覆盖 Web 样式的方案,其中包括 REST 服务、AJAX 和 JSON 服务以及联合 (ATOM/RSS) 源。有关 AJAX 和 JSON 服务的更多信息,请参见 AJAX 集成和 JSON 支持。有关 联合的更多信息,请参见 WCF 联合概述

使用 UriTemplate 和 UriTemplateTable 进行 URI 处理

URI 模板提供了一种可以高效地表示很大的结构相似的 URI 集的语法。例如,下面的模板表示所有以“a”开始并以“c”结束而中间段的值不限的、由三个段组成的 URI:a/{segment}/c

此模板描述如下所示的 URI:

  • a/x/c
  • a/y/c
  • a/z/c
  • 等等。

在此模板中,大括号表示法 ("{segment}") 指示变量段而不是文本值。

.NET Framework 3.5 提供了一个新 API 来处理名为 UriTemplate 的 URI 模板。UriTemplates 允许执行下列操作:

  • 可以使用一组参数来调用 Bind 方法之一,以生成一个与模板匹配的完全封闭的 URI**。这意味着,URI 模板中的所有变量均由实际值替换。
  • 可以使用候选 URI 调用 Match(),此时会使用模板将候选 URI 的各个组成部分分解开来,并会返回一个字典,其中包含根据模板中的变量标记的 URI 的不同部分。
  • Bind() 和 Match() 互为逆方法,因此可以调用 Match( Bind( x ) ) 并返回到开始时的相同环境。

有很多时候(尤其是在服务器需要基于 URI 将请求调度到某个服务操作时),对于那些可以单独对包含的每个模板进行寻址的数据结构,您都需要一直跟踪其中的一组 UriTemplate 对象。UriTemplateTable 表示一组 URI 模板,并在给定的一组模板和候选 URI 中选择最匹配的项。这与任何特定网络堆栈(包括 WCF)不相关,因此可以在任何需要的地方使用。

WCF 服务模型使用 UriTemplateUriTemplateTable 将服务操作与由 UriTemplate 描述的一组 URI 相关联。通过使用 WebGetAttributeWebInvokeAttribute,将服务操作与 UriTemplate 相关联。

服务操作参数和 URL

可以通过键入与服务操作相关联的 URL 来从 Web 浏览器调用 Web 样式服务。这些服务操作可以采用参数,必须在 URL 内使用字符串格式指定这些参数。下表演示可以在 URL 内传递的类型和使用的格式。

类型 格式

Byte

0 - 255

SByte

-128 - 127

Int16

-32768 - 32767

Int32

-2,147,483,648 - 2,147,483,647

Int64

-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807

UInt16

0 - 65535

UInt32

0 - 4,294,967,295

UInt64

0 - 18,446,744,073,709,551,615

Single

-3.402823e38 - 3.402823e38(不需要指数表示法)

Double

-1.79769313486232e308 - 1.79769313486232e308(不需要指数表示法)

Char

任何单个字符

Decimal

使用标准表示法的任何小数(无指数)

Boolean

True 或 False(不区分大小写)

String

任何字符串(不支持空字符串,且不进行转义)

DateTime

MM/DD/YYYY

MM/DD/YYYY HH:MM:SS [AM|PM]

月、日、年

月、日、年 HH:MM:SS [AM|PM]

TimeSpan

DD.HH:MM:SS

此处,DD = 天、HH = 小时、MM = 分钟、SS = 秒钟

Guid

一个 GUID,例如:

936DA01F-9ABD-4d9d-80C7-02AF85C822A8

DateTimeOffset

MM/DD/YYYY HH:MM:SS MM:SS

此处,DD = 天、HH = 小时、MM = 分钟、SS = 秒钟

枚举

例如,定义枚举的枚举值,如以下代码中所示。

public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

可以在查询字符串中指定任何单独的枚举值(或其对应的整数值)。

具有可在类型和字符串表示形式之间来回进行转换的 TypeConverterAttribute 的类型。

取决于类型转换器。

WebGet 和 WebInvoke

Web 样式服务除了使用各种调用谓词(例如 SOAP 服务使用的谓词 HTTP POST)之外,还使用检索谓词(例如 HTTP GET)。Web 编程模型允许服务开发人员使用 WebGetAttributeWebInvokeAttribute 控制与其服务操作相关联的 URI 模板和谓词。可以使用 WebGetAttributeWebInvokeAttribute 来控制各个操作如何绑定到 URI 以及与这些 URI 相关联的 HTTP 方法。例如,在下面的代码中添加 WebGetAttributeWebInvokeAttribute

[ServiceContract]
interface ICustomer
{
  //"View It"
  [OperationContract]
  [WebGet]
  Customer GetCustomer():
  
  //"Do It"
  [OperationContract]
  [WebInvoke]
  Customer UpdateCustomerName( string id, 
                               string newName );
}

可以使用上面的代码生成下面的 HTTP 请求。

GET /GetCustomer

POST /UpdateCustomerName

WebInvokeAttribute 的默认值为 POST,但也可以将其用于其他谓词。

[ServiceContract]
interface ICustomer
{
  //"View It“ -> HTTP GET
  [OperationContract]
  [WebGet( UriTemplate=“customers/{id}” )]
  Customer GetCustomer( string id ):
  
  //"Do It“ -> HTTP PUT
  [OperationContract]
  [WebInvoke( UriTemplate=“customers/{id}”, Method=“PUT” )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

格式和 Web 编程模型

Web 编程模型具有一些可以处理许多不同的数据格式的新功能。在绑定层上,WebHttpBinding 可以读取和写入下列不同种类的数据:

  • XML
  • JSON
  • 不透明二进制流

这意味着 Web 编程模型可以处理任何类型的数据,但是您可能会针对 Stream 进行编程。

.NET Framework 3.5 支持 JSON 数据 (AJAX) 和联合源(包括 ATOM 和 RSS)。有关 这些功能的更多信息,请参见 WCF 联合概述AJAX 集成和 JSON 支持

另请参见

概念

WCF Web 编程对象模型

其他资源

WCF 联合
Web 编程模型