WCF Web HTTP 编程模型概述
Windows Communication Foundation (WCF) WEB HTTP 编程模型提供了使用 WCF 生成 WEB HTTP 服务所需的基本元素。 WCF WEB HTTP 服务旨在由尽可能广泛的客户端访问,包括 Web 浏览器,并具有以下独特的要求:
URI 和 URI 处理 URI 在 WEB HTTP 服务设计中起着核心作用。 WCF WEB HTTP 编程模型使用 UriTemplate 和 UriTemplateTable 类来提供 URI 处理功能。
对 GET 和 POST 操作的支持 WEB HTTP 服务利用 GET 谓词进行数据检索,此外还使用了各种用于数据修改和远程调用的调用谓词。 WCF WEB HTTP 编程模型使用 WebGetAttribute 和 WebInvokeAttribute 将服务操作与 GET 和其他 HTTP 谓词(如 PUT、POST 和 DELETE)相关联。
多个数据格式 Web 样式服务除了处理 SOAP 消息外,还处理多种数据。 WCF WEB HTTP 编程模型使用 WebHttpBinding 和 WebHttpBehavior 来支持许多不同的数据格式,包括 XML 文档、JSON 数据对象和二进制内容的流,如图像、视频文件或纯文本。
WCF Web HTTP 编程模型扩展了 WCF 的范围,涵盖了 Web 风格场景,包括 Web HTTP 服务、AJAX 和 JSON 服务,以及聚合(ATOM/RSS)提要。 有关 AJAX 和 JSON 服务的详细信息,请参阅 AJAX 集成和 JSON 支持。 有关订阅的详细信息,请参阅 WCF 订阅概述。
对可从 WEB HTTP 服务返回的数据类型没有额外的限制。 任何可序列化类型都可以从 WEB HTTP 服务操作返回。 由于 Web 浏览器可以调用 WEB HTTP 服务操作,因此 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。
URI 处理:使用 UriTemplate 和 UriTemplateTable
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)),并返回你开始使用的相同环境。
有很多时候,你会希望在一个数据结构中跟踪一组 UriTemplate 对象,特别是在服务器上需要根据 URI 调度请求到服务操作时。这个数据结构应该能够独立地处理每个包含的模板。 UriTemplateTable 表示一组 URI 模板,并选择给定一组模板和候选 URI 的最佳匹配项。 这与任何特定的网络堆栈(WCF 包括)无关,因此,可以根据需要使用它。
WCF 服务模型利用 UriTemplate 和 UriTemplateTable 将服务操作与 UriTemplate描述的一组 URI 相关联。 通过使用 UriTemplate 或 WebGetAttribute,将服务操作与 WebInvokeAttribute 相关联。 有关 UriTemplate 和 UriTemplateTable的详细信息,请参阅 UriTemplate 和 UriTemplateTable。
WebGet 和 WebInvoke 属性
WCF WEB HTTP 服务利用检索动词(例如 HTTP GET)以及各种调用动词(例如 HTTP POST、PUT 和 DELETE)。 WCF WEB HTTP 编程模型允许服务开发人员通过 WebGetAttribute 和 WebInvokeAttribute控制他们服务操作关联的 URI 模板和谓词。 使用 WebGetAttribute 和 WebInvokeAttribute 可以控制单个操作如何绑定到 URI 以及与这些 URI 关联的 HTTP 方法。 例如,在以下代码中添加 WebGetAttribute 和 WebInvokeAttribute。
[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 [上午|下午] |
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 服务创建通道时,即使将不同的 EndpointAddress 传递给 ChannelFactoryBase<TChannel>,WebHttpBehavior 仍会使用配置文件中设定的 EndpointAddress。