RESTful Services in WCF

This entry was posted by admin Friday, 11 February, 2011
Read the rest of this entry »

RESTful Services

Representational State Transfer makes WCF services more accessible as it enables the service to emit results in plain XML or as JSON (JavaScript Object Notation).

  1. Create a new WCF Service Library and name it as ‘TemperatureServiceLibrary’.
  2. Rename the default service interface and service implementation files as ‘ITemperatureService.cs’ and ‘TemperatureService.cs’.
  3. Open ‘ITemperatureService.cs’ and modify the code to look like the one below.

using System;

using System.Collections.Generic;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Web;

namespace TemperatureServiceLibrary

{

[ServiceContract]

public interface ITemperatureService

{

[OperationContract]

[WebGet(UriTemplate = "CurrentTemp/{city}",

BodyStyle = WebMessageBodyStyle.Bare)]

int GetCurrentTemp(String city);

[OperationContract]

[WebGet(UriTemplate = "Forecast/{city}",

BodyStyle = WebMessageBodyStyle.WrappedResponse,

ResponseFormat = WebMessageFormat.Json)]

Forecast GetForecast(string city);

[OperationContract]

[WebGet(UriTemplate = "Forecasts",

BodyStyle = WebMessageBodyStyle.WrappedResponse)]

List<Forecast> GetForecasts();

}

[DataContract(Name="Forecast", Namespace="")]

public class Forecast

{

[DataMember(Name="City")]

public string City { get; set; }

[DataMember(Name = "Day1LowTemp")]

public double Day1LowTemp { get; set; }

[DataMember(Name = "Day1HighTemp")]

public int Day1HighTemp { get; set; }

[DataMember(Name = "Day1Details")]

public string Day1Details { get; set; }

[DataMember(Name = "Day2LowTemp")]

public int Day2LowTemp { get; set; }

[DataMember(Name = "Day2HighTemp")]

public int Day2HighTemp { get; set; }

[DataMember(Name = "Day2Details")]

public string Day2Details { get; set; }

}

}

  1. Open ‘TemperatureService.cs’ and type-in the following code.

using System;

using System.Collections.Generic;

namespace TemperatureServiceLibrary

{

public class TemperatureService : ITemperatureService

{

#region ITemperatureService Members

public int GetCurrentTemp(string city)

{

var randomNumber = new Random();

int currentTemp = 0;

switch (city)

{

case “Eden Prairie”:

currentTemp = randomNumber.Next(20, 40);

break;

case “Redmond”:

currentTemp = randomNumber.Next(41, 60);

break;

default:

currentTemp = randomNumber.Next(61, 80);

break;

}

return currentTemp;

}

public Forecast GetForecast(string city)

{

var forecast = new Forecast();

var randomNumber = new Random();

forecast.City = city;

switch (city)

{

case “Eden Prairie”:

forecast.Day1LowTemp = randomNumber.Next(20, 30);

forecast.Day1HighTemp = randomNumber.Next(30, 40);

forecast.Day1Details = “Cold, windy, snowy”;

forecast.Day2LowTemp = randomNumber.Next(10, 20);

forecast.Day2HighTemp = randomNumber.Next(20, 30);

forecast.Day2Details = “Colder, windier, snowier”;

break;

case “Redmond”:

forecast.Day1LowTemp = randomNumber.Next(40, 50);

forecast.Day1HighTemp = randomNumber.Next(50, 60);

forecast.Day1Details = “Rain turning to showers”;

forecast.Day2LowTemp = randomNumber.Next(30, 40);

forecast.Day2HighTemp = randomNumber.Next(40, 50);

forecast.Day2Details = “Showers turning to rain”;

break;

default:

forecast.Day1LowTemp = randomNumber.Next(60, 70);

forecast.Day1HighTemp = randomNumber.Next(70, 80);

forecast.Day1Details = “Sunny and warm”;

forecast.Day2LowTemp = randomNumber.Next(60, 70);

forecast.Day2HighTemp = randomNumber.Next(70, 80);

forecast.Day2Details = “Sunny and warm”;

break;

}

return forecast;

}

public List<Forecast> GetForecasts()

{

var forecasts = new List<Forecast>();

var randomNumber = new Random();

var forecast = new Forecast();

forecast.City = “Eden Prairie”;

forecast.Day1LowTemp = randomNumber.Next(20, 30);

forecast.Day1HighTemp = randomNumber.Next(30, 40);

forecast.Day1Details = “Cold, windy, snowy”;

forecast.Day2LowTemp = randomNumber.Next(10, 20);

forecast.Day2HighTemp = randomNumber.Next(20, 30);

forecast.Day2Details = “Colder, windier, snowier”;

forecasts.Add(forecast);

forecast = new Forecast();

forecast.City = “Redmond”;

forecast.Day1LowTemp = randomNumber.Next(40, 50);

forecast.Day1HighTemp = randomNumber.Next(50, 60);

forecast.Day1Details = “Rain turning to showers”;

forecast.Day2LowTemp = randomNumber.Next(30, 40);

forecast.Day2HighTemp = randomNumber.Next(40, 50);

forecast.Day2Details = “Showers turning to rain”;

forecasts.Add(forecast);

forecast = new Forecast();

forecast.City = “Other”;

forecast.Day1LowTemp = randomNumber.Next(60, 70);

forecast.Day1HighTemp = randomNumber.Next(70, 80);

forecast.Day1Details = “Sunny and warm”;

forecast.Day2LowTemp = randomNumber.Next(60, 70);

forecast.Day2HighTemp = randomNumber.Next(70, 80);

forecast.Day2Details = “Sunny and warm”;

forecasts.Add(forecast);

return forecasts;

}

#endregion

}

}

  1. Create a Web Site to host the service and name it as ‘WebHost’. Remove the ‘IService.cs’ and ‘Service.cs’ that are created by default.
  2. Add project reference to the service library project.
  3. Rename the ‘Service.svc’ to ‘TemperatureService.svc’ and change the ‘ServiceHost’ directive to match the following.

<%@ ServiceHost Service=”TemperatureServiceLibrary.TemperatureService”

Factory=”System.ServiceModel.Activation.WebServiceHostFactory” %>

  1. In the Web.Config file, change the binding to ‘webHttpBinding’.
  2. Try to browse the SVC file. You’ll get an error, which is expected.
  3. Now change the url to the following (the port number may be different in your case):

http://localhost:2263/WebHost/TemperatureService.svc/currenttemp/Redmond

You should see the below output (of course with a random number in the result).

<int xmlns=”http://schemas.microsoft.com/2003/10/Serialization/“>57</int>

  1. Try calling other methods also in similar fashion.
  2. Also, you can try changing the output format to JSON (shown in the code above for GetForecast method).

By

Team CVK

Microsoft Competency

www.cvktech.com


Leave a Reply