Originally, in Part 1 of my soon-to-be multi-part series on recreating the MobileMe Gallery in Silverlight I used a separate WCF project (under .NET 3.5) to create my Gallery Service to serve as a proxy between my Silverlight client and the Apple MobileMe service that provides MobileMe Gallery data in JSON format.
Since then, I have upgraded the project to Silverlight 4 and .NET 4 and have decided to move the service code into the Web project that hosts the Silverlight application. More importantly, I have changed the service to use the new config-free RESTful model available in WCF 4.
You can download the latest source from CodePlex here: http://silverlightmobileme.codeplex.com/SourceControl/list/changesets
Now, our web project looks like this:
Now, our service code is as simple as one file – GalleryService.cs which is as follows:
(Notice no .svc file needed anymore thanks to the WebServiceHostFactory in WCF 4)
using System; using System.Configuration; using System.IO; using System.Net; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; namespace Gallery.Web.Services { [ServiceContract(Namespace = "urn:silverlightmobileme.codeplex.com")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class GalleryService { string galleryUrlFormat = ConfigurationManager.AppSettings["GalleryUrlFormat"]; string albumUrlFormat = ConfigurationManager.AppSettings["AlbumUrlFormat"]; [WebGet(UriTemplate = "/{username}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] [OperationContract] public Stream GetGallery(string username) { // TODO: add exception-handling using WebFaultExceptions and HttpStatusCode enumeration var webClient = new WebClient(); string photocastUrl = string.Format(galleryUrlFormat, username); return webClient.OpenRead(photocastUrl); } [WebGet(UriTemplate = "/{username}/{id}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] [OperationContract] public Stream GetAlbum(string username, string id) { var webClient = new WebClient(); string albumUrl = string.Format(albumUrlFormat, username, id); return webClient.OpenRead(albumUrl); } } }
The magic of WCF 4 config-free RESTful services is handled in Global.asax.cs
using System.Web; using System.ServiceModel.Activation; using System.Web.Routing; using Gallery.Web.Services; namespace Gallery.Web { public class Global : HttpApplication { public static void RegisterRoutes(RouteCollection routes) { //routes.Add("GalleryService", new Route( // "GalleryService", // new CustomRouteHandler("~/Services/GalleryService.svc") //)); routes.Add("Default", new Route( "{username}", new CustomRouteHandler("~/Default.aspx") )); RouteTable.Routes.Add(new ServiceRoute("GalleryService", new WebServiceHostFactory(), typeof(GalleryService))); RouteTable.Routes.Add(new ServiceRoute("ConfigService", new WebServiceHostFactory(), typeof(ConfigService))); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } }
Here, after registering our main route for the gallery, we simply add two more routes (of type ServiceRoute), passing it the path we want to map to our services, then the ServiceHostFactory (which handles the config-free RESTful WCF), followed by the type of the service.
That’s it!
Now our service has nice RESTful service endpoints and there is no special WCF configuration needed and it just works.
Try out the new config-free RESTful service here: http://gallery.restazured.com/GalleryService/emily_parker
With WCF 4 config-free RESTful services, we also get handy helper pages for our service consumers to help them understand how to call our services and what type of response to expect.
Try it out here:
http://gallery.restazured.com/GalleryService/help
http://gallery.restazured.com/ConfigService/help
As you’ll see, this displays what operations are available and even provides sample responses. Now that’s RESTful!
Stay tuned for Part 2 where we’ll cover the details of the Silverlight project (now Silverlight 4) where we’ll be using MEF, MVVM and our config-free RESTful WCF services.