Windows Communication Foundation (WCF Service) vs Web Service

Before you read this post, I would like to admit that the content of this blog is not written by me but I copy it from many resources on internet. I always ask (review) myself why Microsoft must invent WCF Service. What are the advantages of WCF in compare to web services? I found many answers on internet and would like to archive them for myself. The source of these information I insert at the end of this post.

WCF ServiceWeb Service
Windows Communication Foundation (WCF) provides .NET Framework class libraries, tools and hosting facilities for enabling software entities to communicate using any protocols, including those used by Web servicesASP.NET provides .NET Framework class libraries and tools for building Web services, as well as facilities for hosting services within Internet Information Services (IIS)
WCF provides tools that can be used when software entities must be made to communicate with one anotherASP.NET Web services tools are solely for building Web services
WCF supports sending messages by using HTTP, as well as the Transmission Control Protocol (TCP), named pipes, and Microsoft Message Queuing (MSMQ). More important, WCF can be extended to support additional transport protocolsASP.NET Web services only support sending messages by using the Hypertext Transfer Protocol (HTTP)
WCF provides much richer facilities for deploying and managing applications than ASP.NET Web services provides-
WCF offers a configuration editor, activity tracing from senders to receivers and back through any number of intermediaries, a trace viewer, message logging, a vast number of performance counters, and support for Windows Management InstrumentationASP.NET has a configuration system

Source : http://msdn.microsoft.com/en-us/library/ms730214.aspx

C#, WPF – Webservice Part I

When I studied WCF Services and wrote some examples for training, I would like to make some basic review about Web Services therefore today I decide to write some simple examples working with Web Services. I know that there are a lot of examples with Web Services on internet but I want to write my own one so that I can use it later. Anyway reading and understanding my own example and explanation is faster than reading from the other one. Let’s start with step by step instructions. This example I took from book “Datenbank-Programmierung mit Visual C# 2005” with some modifications. At the end of this example I will have a running Web Service and a client get its data to show and edit.

1. Open Visual Studio and create new project type ASP.NET Web Service called “OrderService”.
2. Copy and move file Company.mdb as our database into App_Data.
3. In Web.config file, edit “connectionStrings” and add our connection to our database

<connectionStrings>
	<add name="DataConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Company.mdb;Persist Security Info = True" providerName="System.Data.Oledb"/>
</connectionStrings>

4. Remember set your project only running on x86 platform because OleDB does not support 64 bit OS. Add two web methods in our service to get data and let data be updated to database. The code looks little ugly but it works ^^.

private string strConnection = WebConfigurationManager.ConnectionStrings["DataConnectionString"].ToString();
[WebMethod]
public DataSet GetOrders(int CustomerNr, DateTime From, DateTime Till)
{
	DbProviderFactory provider = DbProviderFactories.GetFactory("System.Data.OleDb");
	DbConnection conn = provider.CreateConnection();
	conn.ConnectionString = strConnection;
	DbCommand cmd = provider.CreateCommand();
	cmd.Connection = conn;
	cmd.CommandText = "SELECT * FROM Orders WHERE CustomerNr = ? AND (EntranceDate BETWEEN ? AND ?)";
	DbParameter dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@CustomerNr";
	dbPar.DbType = DbType.Int32;
	dbPar.Value = CustomerNr;
	cmd.Parameters.Add(dbPar);

	dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@From";
	dbPar.DbType = DbType.Date;
	dbPar.Value = From;
	cmd.Parameters.Add(dbPar);

	dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@Till";
	dbPar.DbType = DbType.Date;
	dbPar.Value = Till;
	cmd.Parameters.Add(dbPar);

	DbDataAdapter da = provider.CreateDataAdapter();
	da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
	da.SelectCommand = cmd;
	DataSet dsOrder = new DataSet("OrderDS");
	conn.Open();
	da.Fill(dsOrder,"Orders");
	conn.Close();
	return dsOrder;
}

[WebMethod]
public void SetOrders(ref DataSet OrderDS)
{
	DbProviderFactory provider = DbProviderFactories.GetFactory("System.Data.OleDb");
	DbConnection conn = provider.CreateConnection();
	conn.ConnectionString = strConnection;
	DbCommand cmd = provider.CreateCommand();
	cmd.Connection = conn;
	cmd.CommandText = "SELECT * FROM Orders";
	DbDataAdapter da = provider.CreateDataAdapter();
	da.SelectCommand = cmd;
	da.ContinueUpdateOnError = true;
	DbCommandBuilder cb = provider.CreateCommandBuilder();
	cb.DataAdapter = da;
	conn.Open();
	da.Update(OrderDS.Tables["Orders"]);
	conn.Close();
}

5. Let’s compile and run our service. If everything goes, I’ll get the last result looks like following. Let’s test our GetOrders Web method.

6. Let’s add new project to our solution as our client. The new project is WPF Application “OrderClient”.
7. Use Microsoft Expression Blend 3 to design user interface as shown above. The user interface contain some labels, 3 buttons, 2 date picker and a data grid.
8. Right click on “OrderClient” project and “Add service reference”. On new opening dialog, click on Discover and choose Service in Solution and choose “OrdersService”.

9. Add handler to button click to load data and save changed data to our database.

private void btnLoadOrders_Click(object sender, System.Windows.RoutedEventArgs e)
{
	// TODO: Add event handler implementation here.
	try
	{
		int nCustNr = Convert.ToInt32(txtCustomer.Text);
		if (m_ServiceType == CallServiceTypes.ASYNCHRON)
		{
			OrdersService.GetOrdersCompleted += new EventHandler<OrderClient.OrdersServiceReference.GetOrdersCompletedEventArgs>(OrdersService_GetOrdersCompleted);
			OrdersService.GetOrdersAsync(nCustNr, dpFrom.DisplayDate, dpTill.DisplayDate);
		}
		else
		{
			m_dsOrders = OrdersService.GetOrders(nCustNr, dpFrom.DisplayDate, dpTill.DisplayDate);
			dgData.ItemsSource = m_dsOrders.Tables["Orders"].DefaultView;
		}
		//dgData.DataContext = dsTemp.Tables["Orders"];

	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

10. As you can see in the code above I use asynchronous and synchronous to get data. When using asynchronous method, for any reasons if the web service is not available, the method will not last until Timeout error raises but it will response immediately so that we do not wait. To use asynchronous method, we must configure our referenced service to auto create asynchronous operations.

The complete source code of example you can download here “Order Service