1 Create a RESTful WCF Service
- Open Visual Studio
- Select File > New > Project
- Select WCF Service Library template under Visual C# > WCF templates
- Change the name to ProductServiceLibrary and click OK
- Visual studio will add reference to System.ServiceModel, System.Runtime.Serialization and will add some files with sample code.
- Delete IService1.cs and Service1.cs
- Add reference to System.ServiceModel.Web
- Add a new class called ProductService
1.1 Create the Data Contract
- Open ProductService.cs file that you created.
- Add using System.Runtime.Serialization;
- Add using System.ServiceModel;
- Add using System.ServiceModel.Web;
- Add using using System.ServiceModel.Syndication;
- Add the following code in the ProductService.cs class
[DataContract]
public class ProductReview
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string ProductCode { get; set; }
[DataMember]
public string ProductName { get; set; }
[DataMember]
public string Review {get; set; }
}
1.2 Create the Service Contract
- Add the following code in the ProductService.cs class
[ServiceContract]
public interface IProductService
{
[WebInvoke(Method="POST", UriTemplate="productreview")]
[OperationContract]
void SubmitReview (ProductReview pr);
[ServiceKnownType(typeof(Rss20FeedFormatter))]
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[WebGet(UriTemplate = "productreviews/feed/{type}")]
[OperationContract]
SyndicationFeedFormatter GetFeed(string type);
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[WebGet(UriTemplate = "productreviews/feed/{type}")]
[OperationContract]
SyndicationFeedFormatter GetFeed(string type);
}
1.3 Service Implementation
- Add the following code in the ProductService.cs class
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class ProductService : IProductService
{
List<ProductReview> Reviews = new List<ProductReview>();
void IProductService.SubmitReview(ProductReview pr)
{
Reviews.Add(pr);
}
public SyndicationFeedFormatter GetFeed(string type)
{
SyndicationFeed feed = new SyndicationFeed()
{
Title = new TextSyndicationContent("Product reviews"),
Description = new TextSyndicationContent("Product reviews submitted by buyers"),
Items =
from review in Reviews
select new SyndicationItem()
{
Title = new TextSyndicationContent(review.ProductName),
Content = new TextSyndicationContent(review.Review)
}
};
if (type.Equals("rss"))
{
return new Rss20FeedFormatter(feed);
}
else
{
return new Atom10FeedFormatter(feed);
}
}
}
1.4 Update App.config
- Updated the name of the service in App.config as given below:
<service name="ProductServiceLibrary.ProductService">
1.5 Test Service
- Run the Service.
2 Create a RESTful WCF Service Host
- Add a new project to the current solution: Right click Solution on Solution Explorer > Add > Add New Project
- Select Console Application template under Visual C# > Windows templates
- Change the project name to ConsoleHost and click OK
- In Solution Explorer, under ConsoleHost project, right click References and select Add Reference...
- In the Reference Manager window, add reference to System.ServiceModel, System.ServiceModel.Web, and ProductServiceLibrary solution
- Add using System.ServiceModel;
- Add using System.ServiceModel.Web;
- Add using ProductServiceLibrary;
- Add the following code in Program.cs file
class Program
{
static void Main(string[] args)
{
WebServiceHost host = new WebServiceHost(typeof(ProductService));
try
{
host.Open();
Console.ReadKey();
host.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
host.Abort();
}
Console.ReadKey();
}
}
2.1 Configure Service
- Open App.config and add the following code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="ProductServiceLibrary.ProductService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/Design_Time_Addresses/ProductServiceLibrary/ProductService" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
2.2 Test the application
- Right click on the ConsoleHost project and Set as StartUp project.
- Run Service Host
3 Create a RESTful WCF Service Client
- Add a new project to the current solution: Right click Solution on Solution Explorer > Add > Add New Project
- Select Console Application template under Visual C# > Windows templates
- Change the project name to ConsoleClient and click OK
- In Solution Explorer, under ConsoleClient project, right click References and select Add Reference...
- Add reference to ProductServiceLibrary, System.ServiceModel and System.ServiceModel.Web
- In the Program.cs file,
- add using System.ServiceModel;
- add using System.ServiceModel.Web;
- add using System.ServiceModel.Web;
- add using ProductServiceLibrary;
- Add the following code
class Program
{
static void Main(string[] args)
{
WebChannelFactory<IProductService> factory = new WebChannelFactory<IProductService>(
new Uri("http://localhost:8733/Design_Time_Addresses/ProductServiceLibrary/ProductService"));
IProductService client = factory.CreateChannel();
Console.WriteLine("Press 1 to Add | 2 to List All | 3 to List by Product | 0 to Exit");
Console.Write("Select an option : ");
string opt = Console.ReadLine();
while (!opt.Equals("0"))
{
switch (opt)
{
case "1":
Console.Write("Id:");
string id = Console.ReadLine();
Console.Write("Product Code:");
string code = Console.ReadLine();
Console.Write("Product Name:");
string name = Console.ReadLine();
Console.Write("Your Review:");
string review = Console.ReadLine();
ProductReview pr = new ProductReview();
pr.Id = id;
pr.ProductCode = code;
pr.ProductName = name;
pr.Review = review;
client.SubmitReview(pr);
Console.WriteLine("Thank you for your product review.");
break;
default:
Console.WriteLine("Invalid option");
break;
}
Console.WriteLine();
Console.WriteLine("Press 1 to Add | 2 to List All | 3 to List by Product | 0 to Exit");
Console.Write("Select an option : ");
opt = Console.ReadLine();
}
}
}
{
static void Main(string[] args)
{
WebChannelFactory<IProductService> factory = new WebChannelFactory<IProductService>(
new Uri("http://localhost:8733/Design_Time_Addresses/ProductServiceLibrary/ProductService"));
IProductService client = factory.CreateChannel();
Console.WriteLine("Press 1 to Add | 2 to List All | 3 to List by Product | 0 to Exit");
Console.Write("Select an option : ");
string opt = Console.ReadLine();
while (!opt.Equals("0"))
{
switch (opt)
{
case "1":
Console.Write("Id:");
string id = Console.ReadLine();
Console.Write("Product Code:");
string code = Console.ReadLine();
Console.Write("Product Name:");
string name = Console.ReadLine();
Console.Write("Your Review:");
string review = Console.ReadLine();
ProductReview pr = new ProductReview();
pr.Id = id;
pr.ProductCode = code;
pr.ProductName = name;
pr.Review = review;
client.SubmitReview(pr);
Console.WriteLine("Thank you for your product review.");
break;
default:
Console.WriteLine("Invalid option");
break;
}
Console.WriteLine();
Console.WriteLine("Press 1 to Add | 2 to List All | 3 to List by Product | 0 to Exit");
Console.Write("Select an option : ");
opt = Console.ReadLine();
}
}
}
3.1 Enabling Multiple StartUp projects
- In solution explorer, right click on the solution and select Properties
- Select Multiple Startup Projects option in Common Properties > Startup Project
- For ConsoleHost project change the action to Start and for ConsoleClient project change the action to Start.
- Reorder ConsoleHost so that it is above ConsoleClient, therefore starts before ConsoleClient.
3.2 View using Internet Explorer
- Open Internet explorer
- go to http://localhost:8733/Design_Time_Addresses/ProductServiceLibrary/ProductService/productreviews/feed/rss
- you should be able to see the feed.
- How to: Expose a Feed as Both Atom and RSS - https://msdn.microsoft.com/en-us/library/bb412205(v=vs.110).aspx