WCF Web 编程模型概述
Web 编程模型提供使用 Windows Communication Foundation (WCF) 生成 Web 样式服务所需的基本框架元素。Web 样式服务旨在提供给最大范围的可能客户端(包括不带有附加客户端框架的 Web 浏览器)访问,并且具有以下独特要求:
- URI 和 URI 处理。URI 在 Web 样式服务的设计中扮演一个中心角色。WCF Web 编程模型使用 UriTemplate 和 UriTemplateTable 类来提供 URI 处理功能。
- 支持 GET 和 POST 操作。除了使用各种调用谓词来进行数据修改和远程调用之外,Web 样式服务还使用 GET 谓词进行数据检索。Web 编程模型使用 WebGetAttribute 和 WebInvokeAttribute 将服务操作与 GET 和 POST 两个谓词相关联。
- 多种数据格式。Web 样式服务除了处理 SOAP 消息之外,还可处理很多种数据。Web 编程模型使用 WebHttpBinding 和 WebHttpBehavior 来支持很多不同的数据格式,其中包括 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 服务模型使用 UriTemplate 和 UriTemplateTable 将服务操作与由 UriTemplate 描述的一组 URI 相关联。通过使用 WebGetAttribute 或 WebInvokeAttribute,将服务操作与 UriTemplate 相关联。
服务操作参数和 URL
可以通过键入与服务操作相关联的 URL 来从 Web 浏览器调用 Web 样式服务。这些服务操作可以采用参数,必须在 URL 内使用字符串格式指定这些参数。下表演示可以在 URL 内传递的类型和使用的格式。
类型 | 格式 |
---|---|
0 - 255 |
|
-128 - 127 |
|
-32768 - 32767 |
|
-2,147,483,648 - 2,147,483,647 |
|
-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807 |
|
0 - 65535 |
|
0 - 4,294,967,295 |
|
0 - 18,446,744,073,709,551,615 |
|
-3.402823e38 - 3.402823e38(不需要指数表示法) |
|
-1.79769313486232e308 - 1.79769313486232e308(不需要指数表示法) |
|
任何单个字符 |
|
使用标准表示法的任何小数(无指数) |
|
True 或 False(不区分大小写) |
|
任何字符串(不支持空字符串,且不进行转义) |
|
MM/DD/YYYY MM/DD/YYYY HH:MM:SS [AM|PM] 月、日、年 月、日、年 HH:MM:SS [AM|PM] |
|
DD.HH:MM:SS 此处,DD = 天、HH = 小时、MM = 分钟、SS = 秒钟 |
|
一个 GUID,例如: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
|
MM/DD/YYYY HH:MM:SS MM:SS 此处,DD = 天、HH = 小时、MM = 分钟、SS = 秒钟 |
|
枚举 |
例如,定义枚举的枚举值,如以下代码中所示。
可以在查询字符串中指定任何单独的枚举值(或其对应的整数值)。 |
具有可在类型和字符串表示形式之间来回进行转换的 TypeConverterAttribute 的类型。 |
取决于类型转换器。 |
WebGet 和 WebInvoke
Web 样式服务除了使用各种调用谓词(例如 SOAP 服务使用的谓词 HTTP POST)之外,还使用检索谓词(例如 HTTP GET)。Web 编程模型允许服务开发人员使用 WebGetAttribute 和 WebInvokeAttribute 控制与其服务操作相关联的 URI 模板和谓词。可以使用 WebGetAttribute 和 WebInvokeAttribute 来控制各个操作如何绑定到 URI 以及与这些 URI 相关联的 HTTP 方法。例如,在下面的代码中添加 WebGetAttribute 和 WebInvokeAttribute。
[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 支持。