Transcript slides

REST, JSON and RSS with
Windows Communication
Foundation 3.5
Rob Windsor
ObjectSharp Consulting
[email protected]
Me.About
Visual Basic MVP
Senior Consultant with ObjectSharp Consulting
President of the Toronto Visual Basic User
Group
Member of the MSDN Canada Speakers Bureau
Contact me via my blog
http://msmvps.com/windsor
Agenda
WCF Overview
JSON Services
HTTP Programming Model
Syndication
Windows Communication Foundation
One-stop-shop for services
Consistent object model
First released with .NET Framework 3.0
Focus on the functionality, WCF takes care of the
plumbing
The ABCs of WCF
Client
Service
C
B
A
Message
A
B
C
A
B
C
Address
Binding
Contract
(Where)
(How)
(What)
WCF Standard Bindings
Name
Transport
Encoding
Interop
BasicHttpBinding
NetTcpBinding
NetPeerTcpBinding
NetNamedPipeBinding
WSHttpBinding
WSFederationBinding
WSDualHttpBinding
NetMsmqBinding
NetIntegrationBinding
HTTP/HTTPS
TCP
P2P
IPC
HTTP/HTTPS
HTTP/HTTPS
HTTP/HTTPS
MSMQ
MSMQ
Text
Binary
Binary
Binary
Text, MTOM
Text, MTOM
Text, MTOM
Binary
Binary
Yes
No
No
No
Yes
Yes
Yes
No
Yes
WCF Services
Agenda
WCF Overview
JSON Services
HTTP Programming Model
Syndication
What is JSON?
JavaScript Object Notation
Format for bridging JavaScript and objects
Easier for browsers than XML
ASP.NET AJAX & other AJAX toolkits use it
Other web-aware clients also (Silverlight, etc.)
var data = {“temp” : 59, “descr” : “cloudy”};
document.write (“The weather is “ + data.descr);
WCF / AJAX Integration
WCF AJAX support in Visual Studio
Script manager, VS Project Templates
WCF automatically generates JS proxy
Usage pattern similar to existing one:
Add service to Script Manager control
Write JavaScript code to work with proxy
Configuration not required
Via the WebScriptServiceHostFactory (.svc file)
Works in ASP.NET Medium Trust!
JSON Services
Agenda
WCF Overview
JSON Services
HTTP Programming Model
Syndication
Web Concepts (REST)
Embrace the URI
Segments map to application logic
HTTP GET is special
GET is idempotent (View It)
Multiple GETs to a URI should produce the same (or similar)
results
PUT / POST / DELETE do “stuff” (Do It)
Content-type header is the data model
Image, XML, JSON, etc.
The Web, the URI, and Apps
objectsharp.com/artists/Flaming+Hammer/HitMe
objectsharp.com/artists/Northwind/Overdone
objectsharp.com/artists/{artist}/{album}
objectsharp.com/artists/Flaming+Hammer?album=HitMe
objectsharp.com/artists/Northwind?album=Overdone
objectsharp.com/astists/{artist}?album={album}
Modeling a URI in .NET 3.5
System.UriTemplate
Type for modeling URI to application semantics
Can “bind” data to a template, output a URI
Can “match” a URI to a template, retrieve data
System.UriTemplateMatch
Returned from UriTemplate “match” operations
Can get relative paths and wildcard segments
System.UriTemplateTable
For “binding” a URI to a group of UriTemplates
Roundtrip Data in a URI
Uri address = new Uri(“http://localhost:2000”);
UriTemplate template =
new UriTemplate(“{artist}/{album}”);
Uri boundUri =
template.BindByPosition(address,
“Northwind”, “Overdone”);
UriTemplateMatch match = template.Match(address,
boundUri);
String bandName = match.BoundVariables[“artist”];
URIs in WCF Contracts
Simple URI-to-application mapping
[OperationContract]
[WebGet(UriTemplate=“/Image/{artist}/{album}”)]
Stream GetAlbumImage(String artist, String album);
[OperationContract]
[WebGet(UriTemplate=“/Image?name={artist})]
Stream GetMainImage(String artist);
HTTP Verbs in WCF Contracts
All HTTP verbs are first class citizens
GET, POST, PUT, etc.
“View It” vs “Do It” separation mimics web
[OperationContract]
[WebGet(UriTemplate=“/Image/{bandName}/{album}”)]
Stream GetAlbumImage(String bandName, String album);
[OperationContract]
[WebInvoke(METHOD=“PUT”)] // {PUT, POST, DELETE}
void AddAlbum(AlbumInfo albumInfo);
Data Formats and the Web
HTTP headers can indicate
Accepted data formats (Request)
The format of the returned data (Response)
Common header names:
Accept (Request), Content-Type (Response)
Small sampling of varieties:
text/html, text/css,
image/gif, image/jpeg,
application/atom+xml, application/json,
video/mp4
Specifying Data Format in WCF
WebOperationContext.Current provides access to
incoming request headers
Can also set outgoing response headers
Some are shortcut for easier use
Stream GetAlbumImage(String bandName, String album){
Stream stream; // get the image from somewhere
WebOperationContext.Current.OutgoingResponse.ContentType =
“image/jpeg”;
return stream;
}
Hosting / Binding
WebHttpBinding endpoint on a ServiceHost
Add WebHttpBehavior to the endpoint
Use WebServiceHost/Factory in most cases
Web endpoints do not support WSDL
Works in ASP.NET Medium Trust!
View It and Do It
Agenda
Level-set
JSON Services
HTTP Programming Model
Syndication
Syndication Goals in .NET 3.5
Syndications are more than news and blogs
Representation of any set of data
Usually slowly changing
Unified object model for RSS and Atom
SyndicationFeed / SyndicationItem
Feeds are service operations
Consume as a service or as document
Syndication in .NET Fx 3.5
Single stop for syndications
Create and Consume with or without WCF
Easy to use object model
Transport Agnostic
Supports syndication extensions
Format Agnostic
RSS 2.0 & ATOM 1.0, others possible
Works in ASP.NET Medium Trust!
Syndication Contracts in WCF
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[ServiceKnownType(typeof(Rss20FeedFormatter))]
[ServiceContract]
interface IAlbumSyndication {
[OperationContract]
[WebGet(UriTemplate=“Images/{format}")]
SyndicationFeedFormatter<SyndicationFeed>
Feed(String format);
}
Syndication with PictureServices
Web Centric Features in WCF 3.5
Simple HTTP service development
SOAP and POX from the same contract
JSON messaging capability
Simple syndication – really!
Built on WCF
extensibility points
from .NET 3.0
Resources
Microsoft WCF Community Site
http://wcf.netfx3.com/
PictureServices Samples
http://www.cloudsamples.net/pictureservices/
The EndPoint on Channel 9
http://channel9.msdn.com/shows/The_EndPoint
Justin Smith’s Blog
http://blogs.msdn.com/justinjsmith/
Steve Maine’s Blog
http://hyperthink.net/blog/
Getting Started with WCF
http://msdn2.microsoft.com/en-us/vbasic/bb736015.aspx