WCF Web HTTP 编程模型概述

Windows Communication Foundation (WCF) WEB HTTP 编程模型提供了通过 WCF 生成 WEB HTTP 服务所需的基本元素。 WCF WEB HTTP 服务旨在提供给最大范围的可能客户端(包括 Web 浏览器)访问,并且具有以下独特要求:

  • URI 和 URI 处理 URI 在 WEB HTTP 服务的设计中扮演着核心角色。 WCF WEB HTTP 编程模型使用 UriTemplateUriTemplateTable 类来提供 URI 处理功能。

  • 支持 GET 和 POST 操作 除了使用各种调用谓词来进行数据修改和远程调用之外,WEB HTTP 服务还使用 GET 谓词进行数据检索。 WCF WEB HTTP 编程模型使用 WebGetAttributeWebInvokeAttribute 将服务操作与 GET 和其他 HTTP 谓词(如 PUT、POST 和 DELETE)相关联。

  • 多种数据格式 Web 样式服务除了处理 SOAP 消息之外,还可处理很多种数据。 WCF WEB HTTP 编程模型使用 WebHttpBindingWebHttpBehavior 来支持许多不同的数据格式,包括 XML 文档、JSON 数据对象和二进制内容(例如图像、视频文件或纯文本)的流。

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

对于可从 WEB HTTP 服务返回的数据的类型没有额外的限制。 任何可序列化类型都可以从 WEB HTTP 服务操作返回。 因为 WEB HTTP 服务操作可以通过 Web 浏览器调用,所以对可在 URL 中指定的数据类型有一个限制。 有关默认情况下支持的类型的更多信息,请参见下面的“UriTemplate 查询字符串参数和 URL”一节。 通过提供您自己的 T:System.ServiceModel.Dispatcher.QueryStringConverter 实现来指定如何将 URL 中指定的参数转换为实际参数类型,可以更改默认行为。 有关详细信息,请参阅 QueryStringConverter

注意

使用 WCF WEB HTTP 编程模型编写的服务不使用 SOAP 消息。 由于不使用 SOAP,因此无法使用 WCF 提供的安全功能。 然而,您可以通过使用 HTTPS 承载服务来使用基于传输的安全性。 有关 WCF 安全的详细信息,请参阅安全概览

警告

为 IIS 安装 WebDAV 扩展会导致 Web HTTP 服务返回 HTTP 405 错误,因为 WebDAV 扩展试图处理所有 PUT 请求。 若要解决此问题,你可卸载 WebDAV 扩展或为网站禁用 WebDAV 扩展。 有关详细信息,请参阅 IIS 和 WebDav

使用 UriTemplate 和 UriTemplateTable 进行 URI 处理

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

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

  • a/x/c

  • a/y/c

  • a/z/c

  • 等等。

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

.NET Framework 提供了一个 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 相关联。 通过使用 UriTemplateWebGetAttribute,将服务操作与 WebInvokeAttribute 相关联。 有关 UriTemplateUriTemplateTable 的详细信息,请参阅 UriTemplate 和 UriTemplateTable

WebGet 和 WebInvoke 特性

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

[ServiceContract]
interface ICustomer
{
  //"View It"

  [WebGet]
  Customer GetCustomer():

  //"Do It"
    [WebInvoke]
  Customer UpdateCustomerName( string id,
                               string newName );
}

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

GET /GetCustomer

POST /UpdateCustomerName

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

[ServiceContract]
interface ICustomer
{
  //"View It" -> HTTP GET
    [WebGet( UriTemplate="customers/{id}" )]
  Customer GetCustomer( string id ):

  //"Do It" -> HTTP PUT
  [WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

若要查看使用 WCF WEB HTTP 编程模型的 WCF 服务的完整示例,请参阅如何:创建基本 WCF WEB HTTP 服务

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 的类型。 取决于类型转换器。

格式和 WCF WEB HTTP 编程模型

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

  • XML

  • JSON

  • 不透明二进制流

这意味着 WCF WEB HTTP 编程模型可以处理任何类型的数据,但可能需要对 Stream 进行编程。

.NET Framework 3.5 支持 JSON 数据 (AJAX) 和联合源(包括 ATOM 和 RSS)。 有关这些功能的详细信息,请参阅 WCF Web HTTP 格式设置WCF 联合概述AJAX 集成和 JSON 支持

WCF WEB HTTP 编程模型和安全

由于 WCF WEB HTTP 编程模型不支持 WS-* 协议,因此保证 WCF WEB HTTP 服务安全的唯一方式是使用 SSL 通过 HTTPS 公开服务。 有关使用 IIS 7.0 设置 SSL 的信息,请参阅如何在 IIS 中实现 SSL

WCF WEB HTTP 编程模型疑难解答

当使用 ChannelFactoryBase<TChannel> 调用 WCF WEB HTTP 服务以创建通道时,即使将其他 WebHttpBehavior 传递给 EndpointAddressEndpointAddress 也会使用配置文件中设置的 ChannelFactoryBase<TChannel>

另请参阅