Some time ago I wrote a post about how to create REST clients using WCF and taking advantage of its extensibility to obtain a type safe endpoint. My approach implied create a bunch of WCF behaviors and other extensions that intercepts the messages and customize the representation over the wire.
Now with .NET 3.5 the WCF framework is extended to support natively these kind of scenarios and is really easy and clean to use. There are some good tutorials describing these extensions, like this one.
So, I've put hands on these exciting tools, and migrated my previous example to use the new framework. Ideally I would just remove my customizations, configure the endpoint with a webHttpBinding
and a webHttp
behavior. But this wont work because in my service contract I have some operations receiving unsupported argument types like int?
, DateTime?
and string[]
. Fortunately, one more time the WCF team did and excellent job providing us the extensibility points we need :-).
Instead of configuring directly the webHttp
behavior, I've created a custom DeliciousWebHttpBehavior
(extending WebHttpBehavior
) and overriding only the GetQueryStringConverter
method. The QueryStringConverter
is responsible of converting the arguments to a string representation and back again. Creating a DeliciousQueryStringConverter
that supports our special types is fair enough.
After that I only have to change the attributes in the operations, so for example where in the previous example says:
[OperationContract(Action = "/v1/posts/get")] PostsResponse GetPosts(string tag, DateTime? dt, string url);
in the new version is changed by:
[OperationContract] [WebGet(UriTemplate = "/v1/posts/get?tag={tag}&dt={dt}&url={url}")] PostsResponse GetPosts(string tag, DateTime? dt, string url);
Happy RESTing! :-).
Download: wcfrestpox35.zip