技术开发 频道

使用WCF和.NET 3.5 进行HTTP编程

  【IT168 技术文档】当它作为 Microsoft® .NET Framework 3.0 的一部分首次发布时,Windows® Communication Foundation (WCF) 包含一个 Plain Old XML (POX) 的通用对象模型,以及可以进行多种传输的 SOAP 消息。由于 WCF 也可以深入支持 WS-* Web 服务标准,因此它可以毫不费力地与其他现代服务平台进行互操作。.NET Framework 3.0 中的 WCF 具有高度可扩展性,而且拥有可靠的可管理性功能,如消息记录、活动跟踪、服务限制、实例管理以及线程控制。

  .NET Framework 3.5 中的 WCF 构建于 .NET Framework 3.0 的扩展点之上,从而为构建符合 Web 原则的服务提供一流的支持。它包含一个易于使用的 HTTP 编程模型、JavaScript Object Notation (JSON) 消息传递功能,以及新的整合 API,使创建和使用整合的内容变得非常简便。凭借此功能集,WCF 现已成为将服务连接到 Web 客户端的首选服务平台,不论这些客户端是 ASP.NET AJAX 控件、SilverlightTM 客户端,还是浏览器。这些功能在部分信任方案(如 ASP.NET 中等信任)中也可发挥作用,因此您可以在各种宿主环境中承载 WCF 服务。除此之外,Visual Studio® 2008 中还集成了新的工具,极大地缩短了启动和运行服务所需的时间。

  使 .NET Framework 3.5 中的 WCF 如此引人注目的特色之一是,以 Web 为中心的通信与 SOAP 和 WS-* 标准组合到了一个服务堆栈和对象模型中。这意味着您可以构建这样一个服务,即采用 SOAP 和 WS-* 在企业内部或跨企业边界进行通信,同时还可以将同一服务配置为使用 Web 协议与外部通信。实际上,WCF 处理了服务中的烦琐细节工作,这样您可以更加专注于服务所提供的功能。

  本文介绍了 .NET Framework 3.5 中 WCF 的一些以 Web 为中心的新功能。首先是关于 HTTP 和 Web 中的一些重要体系结构原则的定级性讨论,然后将为您介绍 WCF 中新的 HTTP 编程模型,最后是新的整合 API。
 
  HTTP 消息基础知识

  您可能几乎每天都在使用 Web,但有多少次会考虑使 Web 运转起来的核心概念是什么呢?我并不想重复关于体系结构概念的内容,但结合到 Web 中的某些关键概念并不是那么一目了然。在我看来,要构建符合 Web 协议的服务,对这些原则有个很好的了解是第一步,也是十分必要的。请记住,由于此主题的研究可长达一整本书,因此在本文中我将仅提及一些要点。

  HTTP 是 Web 的传输机制。HTTP 要求一种请求/响应消息交换模式 (MEP)。您每次使用浏览器导航到 Web 页时都会发生下面这个过程:您发出一个获取资源的请求,然后一个包含该资源的响应将返回。HTTP 传输会定义若干动词(也称为方法),将功能添加到请求/响应 MEP 上,如 GET、POST、PUT 和 DELETE。为了清楚阐明 HTTP 动词之间的某些差别,我们来看看 HTTP POST 是什么样的。下面是一个简略的版本:
 
POST /myservice/PostAlbum HTTP 1.1
HOST: www.cloudsample.net
<albumInfo>
  
<albumId>15</albumId>
</albumInfo>

  这实际上只是一个发送给侦听应用程序的消息。在此例中,消息是发送到 http://www.cloudsamples.net/myservice/PostAlbum。消息还有一个负载,包含的是 albumId 字段的值。概括地说,您可以将 HTTP POST 想象成是将负载发送到侦听应用程序的一种方法。

  本例的负载十分简单,我可以将整个负载表示成数字 15。要使其工作,接收应用程序需要知道数字 15 是映射到 albumId 字段的值。这是 HTTP GET 中提供的关键功能之一。比方说,这就是从先前的 HTTP POST 转换到 HTTP GET 的结果:
 
GET /myservice/GetAlbum/15 HTTP 1.1
HOST: www.cloudsamples.net

  HTTP GET 是经过优化的 HTTP POST,它无需负载。实际上,URI 就是负载。结果就是可以缩减消息的大小,从而缩短传输时间。缩减的消息以及对 URI 的依赖性还可带来其他的正面效应:它可以方便其他应用程序(如代理程序或浏览器)缓存先前针对同一资源的 HTTP GET 消息的结果。值得注意的是,对 HTTP GET 的使用比任何其他 HTTP 动词都要频繁得多。

  HTTP GET 的核心是请求获取某个资源。为了阐明这一点,请想象您在网页(如 http://www.cloudsamples.net/pictureservices)上找到了一个有趣的资源,并且希望用电子邮件将其发送给某位朋友。当您的朋友收到该电子邮件时,您希望他能够单击链接来并看到与您所见相同的页面。如果 http://www.cloudsamples.net/pictureservices 上的资源突然变成了来自 MSNBC 的最新新闻报道,这当然会让您感到惊讶。实际上,HTTP GET 中所使用的 URI 代表的就是一个资源,通常您认为该资源不会改变。

  虽然 HTTP GET 代表的内容已有明确定论,但对于其他 HTTP 动词而言并非如此。让我们来考虑一下,将一个 HTTP DELETE 消息发送给某个接收应用程序意味着什么。接收应用程序是否需要更改其状态或执行某个动作呢?通常,HTTP DELETE 是与删减性的状态变化或动作相关联,但该状态变化的具体信息则未定义。HTTP PUT 同样如此。通常,HTTP PUT 是与某些增加性状态变化或动作相关联,但变化的具体情况则因应用程序而异。
0
相关文章