KEMBAR78
Building RESTful Services with WCF 4.0 | PDF
Building RESTful Services with
                         WCF
                        Aaron Skonnard
                   Cofounder, Pluralsight
Overview
Why REST?
Why REST?

1. Most folks don't need SOAP's key features
     Transport-neutrality
     Advanced WS-* protocols
     Basic SOAP is just like REST but w/out the benefits
Why REST?

2. REST is simple and the interface is uniform
     It's just HTTP + XML/JSON/XHTML
     Uniform interface that everyone understands
     Therefore, it’s more interoperable!
REST is not RPC

SOAP emphasizes verbs while REST emphasizes nouns or
"resources"
SOAP                        REST                          With REST, you define
                                                                resources,
 getUser()                                             and use a uniform interface to
 addUser()                   User { }                  operate on them (HTTP verbs)
 removeUser()                Location { }
 ...
 getLocation()                                             XML representation
 addLocation()
 ...                         <user>
                               <name>Jane User</name>
 With SOAP, you define         <gender>female</gender>
custom operations (new         <location href="http://example.org/locations/us/ny/nyc"
                               >New York City, NY, US</location>
verbs), tunnels through
                             </user>
          POST
Is REST too simple for complex systems?
Why REST?

3. REST is how the Web works
     It scales from HTTP's built-in caching mechanisms
     Caching, bookmarking, navigating/links, SSL, etc
     You can access most REST services with a browser
REST in WCF
Windows Communication Foundation

WCF doesn't take sides – it provides a unified programming
model
   And allows you to use SOAP, POX, REST, whatever data format, etc


           Architecture: SOAP, REST, distributed objects, etc

               Transport Protocol: HTTP, TCP, MSMQ, etc
 WCF
             Message format: XML, RSS, JSON, binary, etc

                   Message protocols: WS-*, none, etc
WCF programming styles

Most of the built-in WCF bindings use SOAP & WS-* by default
   You have to configure them to disable SOAP
WCF 3.5 comes with a new Web (REST) programming model
   Found in System.ServiceModel.Web.dll
   Allows you to map HTTP requests to methods via URI templates
You enable the Web model with a new binding/behavior
   Apply to messaging layer using WebHttpBinding
   Apply to dispatcher using WebHttpBehavior
WebServiceHost

     WebServiceHost simplifes hosting Web-based services
        Derives from ServiceHost and overrides OnOpening
        Automatically adds endpoint for the base address using
        WebHttpBinding
        Automatically adds WebHttpBehavior to the endpoint

               ...
 this host     WebServiceHost host = new WebServiceHost(
 adds the          typeof(EvalService),
Web binding        new Uri("http://localhost:8080/evals"));
& behavior     host.Open(); // service is up and running
               Console.ReadLine(); // hold process open
               ...

     <%@ ServiceHost Language="C#" Service="EvalService" Factory=
         "System.ServiceModel.Activation.WebScriptServiceFactory" %>
WebGetAttribute

WebGetAttribute maps HTTP GET requests to a WCF method
   Supply a UriTemplate to defining URI mapping
   The UriTemplate variables map to method parameters by name
   BodyStyle property controls bare vs. wrapped
   Request/ResponseFormat control body format
                                               URI template

[ServiceContract]
public interface IEvalService
{
    [WebGet(UriTemplate="evals?name={name}&score={score}")]
    [OperationContract]
    List<Eval> GetEvals(string name, int score);
...
WebInvokeAttribute

WebInvokeAttribute maps all other HTTP verbs to WCF
methods
   Adds a Method property for specifying the verb (default is POST)
   Allows mapping UriTemplate variables
                                                 Specify which
   Body is deserialized into remaining parameter HTTP verb this
                                                  responds to

 [ServiceContract]
 public interface IEvals
 {
     [WebInvoke(UriTemplate ="/evals?name={name}",Method="PUT")]
     [OperationContract]
     void SubmitEval(string name, Eval eval /* body */);
 ...
WebOperationContext

Use WebOperationContext to access HTTP specifics within
methods
   To retreived the current context use WebOperationContext.Current
   Provides properties for incoming/outgoing request/response context
Each context object surfaces most common HTTP details
   URI, ContentLength, ContentType, Headers, ETag, etc
WebMessageFormat

WCF provides support for two primary Web formats: XML &
JSON
   You control the format via RequestFormat and ResponseFormat

  [ServiceContract]
  public interface IEvals
  {
      [WebGet(UriTemplate = "/evals?name={nameFilter}",
          ResponseFormat = WebMessageFormat.Json)]
      [OperationContract]
      List<Eval> GetCurrentEvals(string nameFilter);
  ...

                               Specify the message format
Syndication programming model

    WCF comes with a simplified syndication programming model
       The logical data model for a feed is SyndicationFeed
       You can use it to produce/consume feeds in a variety of formats
    You use a SyndicationFeedFormatter to work with a specific
    format
       Use Atom10FeedFormatter or RSS20FeedFormatter today
                       [ServiceKnownType(typeof(Atom10FeedFormatter))]
                       [ServiceKnownType(typeof(Rss20FeedFormatter))]
                       [ServiceContract]
                       public interface IEvalService {
                           [WebGet(UriTemplate = "evalsfeed")]
                           [OperationContract]
allows you to return
                           SyndicationFeedFormatter GetEvalsFeed();
an Atom or RSS feed    ...
                       }
New in 4.0
Improved REST Support

Many features in the WCF REST Starter Kit are now part of WCF
4.0
Automatic help page

WCF 4 provides an automatic help page for REST services
   Configure the <webHttp> behavior with helpEnabled=“true”
Message format selection

WCF 4 also provides automatic format selection for XML/JSON
   This feature is built on the HTTP “Accept” headers



<configuration>
  <system.serviceModel>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true"
            automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
</configuration>
Http caching support

WCF 4 provides a simpler model for managing HTTP caching
   They built on the ASP.NET caching profile architecture
   You define an [AspNetCacheProfile] for your GET operations
   Shields you from dealing with HTTP caching headers yourself



     [AspNetCacheProfile("CacheFor60Seconds")]
     [WebGet(UriTemplate=XmlItemTemplate)]
     [OperationContract]
     public Counter GetItemInXml()
     {
         return HandleGet();
     }
REST project templates

Download the new REST project templates via the new Visual
Studio 2010 Extension Manager (Tools | Extension Manager)
What about
 OData?
WCF Web Api
  Futures
http://wcf.codeplex.com

Building RESTful Services with WCF 4.0

  • 1.
    Building RESTful Serviceswith WCF Aaron Skonnard Cofounder, Pluralsight
  • 2.
  • 3.
  • 4.
    Why REST? 1. Mostfolks don't need SOAP's key features Transport-neutrality Advanced WS-* protocols Basic SOAP is just like REST but w/out the benefits
  • 5.
    Why REST? 2. RESTis simple and the interface is uniform It's just HTTP + XML/JSON/XHTML Uniform interface that everyone understands Therefore, it’s more interoperable!
  • 6.
    REST is notRPC SOAP emphasizes verbs while REST emphasizes nouns or "resources" SOAP REST With REST, you define resources, getUser() and use a uniform interface to addUser() User { } operate on them (HTTP verbs) removeUser() Location { } ... getLocation() XML representation addLocation() ... <user> <name>Jane User</name> With SOAP, you define <gender>female</gender> custom operations (new <location href="http://example.org/locations/us/ny/nyc" >New York City, NY, US</location> verbs), tunnels through </user> POST
  • 7.
    Is REST toosimple for complex systems?
  • 8.
    Why REST? 3. RESTis how the Web works It scales from HTTP's built-in caching mechanisms Caching, bookmarking, navigating/links, SSL, etc You can access most REST services with a browser
  • 9.
  • 10.
    Windows Communication Foundation WCFdoesn't take sides – it provides a unified programming model And allows you to use SOAP, POX, REST, whatever data format, etc Architecture: SOAP, REST, distributed objects, etc Transport Protocol: HTTP, TCP, MSMQ, etc WCF Message format: XML, RSS, JSON, binary, etc Message protocols: WS-*, none, etc
  • 11.
    WCF programming styles Mostof the built-in WCF bindings use SOAP & WS-* by default You have to configure them to disable SOAP WCF 3.5 comes with a new Web (REST) programming model Found in System.ServiceModel.Web.dll Allows you to map HTTP requests to methods via URI templates You enable the Web model with a new binding/behavior Apply to messaging layer using WebHttpBinding Apply to dispatcher using WebHttpBehavior
  • 12.
    WebServiceHost WebServiceHost simplifes hosting Web-based services Derives from ServiceHost and overrides OnOpening Automatically adds endpoint for the base address using WebHttpBinding Automatically adds WebHttpBehavior to the endpoint ... this host WebServiceHost host = new WebServiceHost( adds the typeof(EvalService), Web binding new Uri("http://localhost:8080/evals")); & behavior host.Open(); // service is up and running Console.ReadLine(); // hold process open ... <%@ ServiceHost Language="C#" Service="EvalService" Factory= "System.ServiceModel.Activation.WebScriptServiceFactory" %>
  • 13.
    WebGetAttribute WebGetAttribute maps HTTPGET requests to a WCF method Supply a UriTemplate to defining URI mapping The UriTemplate variables map to method parameters by name BodyStyle property controls bare vs. wrapped Request/ResponseFormat control body format URI template [ServiceContract] public interface IEvalService { [WebGet(UriTemplate="evals?name={name}&score={score}")] [OperationContract] List<Eval> GetEvals(string name, int score); ...
  • 14.
    WebInvokeAttribute WebInvokeAttribute maps allother HTTP verbs to WCF methods Adds a Method property for specifying the verb (default is POST) Allows mapping UriTemplate variables Specify which Body is deserialized into remaining parameter HTTP verb this responds to [ServiceContract] public interface IEvals { [WebInvoke(UriTemplate ="/evals?name={name}",Method="PUT")] [OperationContract] void SubmitEval(string name, Eval eval /* body */); ...
  • 15.
    WebOperationContext Use WebOperationContext toaccess HTTP specifics within methods To retreived the current context use WebOperationContext.Current Provides properties for incoming/outgoing request/response context Each context object surfaces most common HTTP details URI, ContentLength, ContentType, Headers, ETag, etc
  • 16.
    WebMessageFormat WCF provides supportfor two primary Web formats: XML & JSON You control the format via RequestFormat and ResponseFormat [ServiceContract] public interface IEvals { [WebGet(UriTemplate = "/evals?name={nameFilter}", ResponseFormat = WebMessageFormat.Json)] [OperationContract] List<Eval> GetCurrentEvals(string nameFilter); ... Specify the message format
  • 17.
    Syndication programming model WCF comes with a simplified syndication programming model The logical data model for a feed is SyndicationFeed You can use it to produce/consume feeds in a variety of formats You use a SyndicationFeedFormatter to work with a specific format Use Atom10FeedFormatter or RSS20FeedFormatter today [ServiceKnownType(typeof(Atom10FeedFormatter))] [ServiceKnownType(typeof(Rss20FeedFormatter))] [ServiceContract] public interface IEvalService { [WebGet(UriTemplate = "evalsfeed")] [OperationContract] allows you to return SyndicationFeedFormatter GetEvalsFeed(); an Atom or RSS feed ... }
  • 18.
  • 19.
    Improved REST Support Manyfeatures in the WCF REST Starter Kit are now part of WCF 4.0
  • 20.
    Automatic help page WCF4 provides an automatic help page for REST services Configure the <webHttp> behavior with helpEnabled=“true”
  • 21.
    Message format selection WCF4 also provides automatic format selection for XML/JSON This feature is built on the HTTP “Accept” headers <configuration> <system.serviceModel> <standardEndpoints> <webHttpEndpoint> <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/> </webHttpEndpoint> </standardEndpoints> </system.serviceModel> </configuration>
  • 22.
    Http caching support WCF4 provides a simpler model for managing HTTP caching They built on the ASP.NET caching profile architecture You define an [AspNetCacheProfile] for your GET operations Shields you from dealing with HTTP caching headers yourself [AspNetCacheProfile("CacheFor60Seconds")] [WebGet(UriTemplate=XmlItemTemplate)] [OperationContract] public Counter GetItemInXml() { return HandleGet(); }
  • 23.
    REST project templates Downloadthe new REST project templates via the new Visual Studio 2010 Extension Manager (Tools | Extension Manager)
  • 24.
  • 25.
    WCF Web Api Futures http://wcf.codeplex.com