Essential Windows Communication Foundation for .NET Framework 3.5: Programmable Web
PROGRAMMABLE WEB REFERS to a set of enabling technologies designed to help developers build the services for the Web. There are many ways of building services for the Web. We have already mentioned throughout the book how WCF can be used to build WS-* Web services, which use SOAP, HTTP, and XML. Services based on WS-* are typically built using a service-oriented architecture approach.
A service-oriented architecture approach follows four main tenants:
- Boundaries are explicit.
- Services are autonomous.
- Services share schema and contract, no class.
- Services compatibility is determined based on policy (see http://msdn.microsoft.com/msdnmag/issues/04/01/Indigo/default.aspx).
Services can be built from other styles of architectures, such as Representational State Transfer (REST). REST is an architectural style described in a dissertation from Roy Fielding (see www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm). REST follows a set of principles that are based on constraints:
- A client/server approach is used to separate user interface from data storage.
- Client/server interaction is stateless.
- Network efficiency is improved using caching.
- Components of the system interact using a uniform interface.
- The overall system can be composed using a layering approach.
The REST architectural style is often referred to as the architectural style of the Web because the constraints can easily be seen in modern Web architectures. We mention service orientation and REST because these are two common architectural styles for building services on the Web today. It is important to understand that WCF does not dictate the architectural style or manner in which to build services. Instead it exposes a set of features and capabilities that allow you to build services using a variety of architectural styles. The rest of this chapter will focus on the features that help developers build services for the Web. To help understand the motivation behind these new features, we will examine how developers use the Web today.
All About the URI
Most everyone should be familiar with URIs because this is how people browse the Web today. People access resources, such as HTML pages, via URIs typed into the address bar of their browsers. Browsers can access a variety of resources using URIs, including images, videos, data, applications, and more. Accessing of resources via a URI is also one of the principles behind the REST architectural style.
Table 13.1 shows several examples of resources on the Web that can be accessed in this manner.
Table 13.1. URI Examples
URI |
Description |
Microsoft (MSFT) stock quotes in comma-separated (CSV) format from Yahoo! |
|
Microsoft (MSFT) stock quote in custom JSON format from Google |
|
A Wikipedia Web page about "Apples" |
|
Weather information for Waltham, MA from Weather.com |
|
News article on MSN.com |
|
http://pipes.yahoo.com/pipes/pipe.run?_id=jlM12Ljj2xGAdeUR1vC6Jw& |
Wall Street corporate events listing services (for example, stock splits, mergers, and so on) in JSON format |
Slashdot syndication feed in RSS format |
|
Flickr photo search in custom XML format |
Each of the examples specifies a URI that takes a set of parameters that identifies a resource to retrieve. Parameters are sent either as query strings or embedded as a part of the path of the URI. This means that the URI is used to identify, locate, and access resources. To better understand what we mean, we look at the URL used to retrieve stock quotes from Google. It is obvious from the following URL that the parameter q represents the stock symbol and is passed into the service as a query string parameter.
http://finance.google.com/finance/info?q=MSFT
What is not represented is whether this URL is accessed using an HTTP GET or some other HTTP action. For now, we will assume that GET is being used. The URL can be rewritten with a parameter for the stock symbol in place of the MSFT stock symbol. Using this simplification of the URL, we can identify a number of resources.
http://finance.google.com/finance/info?q={StockSymbol}
This example helps form the basis for how we can identify and access resources on the Web.
The Ubiquitous GET
One thing in common with all the URIs in Table 13.1 is that they use the HTTP protocol to access resources. The HTTP protocol is considered the protocol of the Web. The original purpose of HTTP was to exchange HTML pages, but it has since been used to access all types of resources, including images, video, applications, and much more. The way in which it does this is by specifying a resource identifier and an action to be performed on that resource. URIs identify the resource. The action is defined by a set of HTTP verbs that specify the action to be performed on the resource. Table 13.2 shows a list of common HTTP verbs used on the Web today. There are many ways to interact with resources over the Web using the HTTP protocol, but none is as ubiquitous as GET. GET is by far the most widely used verb. POST comes in second, followed by other verbs such as PUT and DELETE.
Table 13.2. Common HTTP Verbs
Verb |
Description |
GET |
Retrieve the resource identified by the URI. |
POST |
Send a resource to the server based on the resource identified by the URI. |
PUT |
Store a resource based on the resource identified by the URI. |
DELETE |
Delete a resource based on the resource identified by the URI. |
HEAD |
Identical to GET except that the response is not returned. This is used to retrieve metadata for the resource identified by the URI. |
HTTP verbs form the basis for how we can interact with resources on the Web. GET is the most widely used HTTP verb because it is used to retrieve resources. HTTP verbs help to provide a uniform interface for interacting with resources, which is a constraint based on the REST architectural style.
Format Matters
The list of URIs in Table 13.1 demonstrates the vast number of formats available on the Web today. The content returned from these URIs includes HTML, XML, JSON, RSS, CSV, and custom formats. This means that developers have not found a single format that can represent all resources on the Web. For a while, it seemed that all roads would lead to XML as the single format. XML is a great mechanism for providing structure to data and for sharing information. For example, SOAP is a protocol for exchanging XML-based messages and is the foundation for traditional Web services. WCF provides support for the SOAP protocol. SOAP does more than provide structure to data, though. SOAP adds header information, which allows for advanced capabilities such as transport independence, message-level security, and transactions. Web developers are not necessarily concerned about such capabilities and need a way to exchange information. In these situations, formats such as Plain-Old-XML (POX) and JavaScript Object Notation (JSON) are often used.
POX is usually about developers not needing the capabilities that WS-* has to offer and not wanting the perceived overhead of SOAP. In these situations, using POX is a "good enough" format for their needs. JSON, on the other hand, is an efficient format for returning data to browser clients that leverage JavaScript. JSON as a format is more efficient than SOAP and can offer significant performance and scalability benefits when you are trying to reduce the number of bytes on the wires. What this comes down to is that format matters, and developers need to be able to work with a number of formats when using the Web.
Web Programming with WCF
Table 13.3 highlights some of the major features available to developers when they use WCF and .NET Framework 3.5. The remainder of this chapter focuses on the features within WCF that help enable the "programmable Web."
Table 13.3. Web Programming Features in .NET Framework 3.5
Verb |
Description |
Uri and UriTemplates |
Enhanced support for working with URIs to support REST architectural patterns. |
webHttpBinding Binding |
A new binding that builds in support for POX and JSON, formal support for HTTP verbs including GET, and URI-based dispatching. |
ASP.NET AJAX Integration |
Integration with ASP.NET AJAX to support client-side service proxies. |
Content Syndication |
Classes for publishing and consuming RSS and ATOM syndication feeds. |