This is the first of six tasks required to create a basic Windows Communication Foundation (WCF) service and a client that can call the service. For an overview of all six of the tasks, see the Getting Started Tutorial topic.
When creating a basic WCF service, the first task is to define a contract. The contract specifies what operations the service supports. An operation can be thought of as a Web service method. Contracts are created by defining a C++, C#, or Visual Basic (VB) interface. Each method in the interface corresponds to a specific service operation. Each interface must have the ServiceContractAttribute applied to it and each operation must have the OperationContractAttribute applied to it. If a method within an interface that has the ServiceContractAttribute does not have the OperationContractAttribute, that method is not exposed.
The code used for this task is provided in the example following the procedure.
Open Visual Studio 2008 as an administrator by right-clicking the program in the Start menu and selecting Run as administrator.
Create a new console application project. Click the File menu and select New, Project. In the New Project dialog, select Visual Basic or Visual C#, and choose the Console Application template, and name it Service. Use the default Location.
Service
For a C# project Visual Studio creates a file called Program.cs. This class will contain an empty method called Main(). For a VB project, Visual Studio creates a file called Module1.vb with an empty subroutine called Main(). These methods are required for a console application project to build correctly, so you can safely leave them in the project.
Change the default Service namespace to Microsoft.ServiceModel.Samples. To do this, right-click the project in the Solution Explorer and select Properties. Make sure that the Application tab on the left side of the Properties dialog is selected. For a C# project, type Microsoft.ServiceModel.Samples in the edit box labeled Default Namespace. For a VB project, type Microsoft.ServiceModel.Samples in the edit box labeled Root namespace. Click the File menu and select Save All to save your changes.
Microsoft.ServiceModel.Samples
If you are using C#, change the namespace in the generated Program.cs file to Microsoft.ServiceModel.Samples as shown in the following example.
namespace Microsoft.ServiceModel.Samples { class Program { static void Main(string[] args) { } } }
If you are using VB, add a Namespace statement and an End Namespace statement to the generated Module1.vb as shown in the following example.
Namespace Microsoft.ServiceModel.Samples Module Module1 Sub Main() End Sub End Module End Namespace
Add a reference to System.ServiceModel.dll to the project:
Add a using statement (Imports in Visual Basic) for the System.ServiceModel namespace.
Imports System.ServiceModel
using System.ServiceModel;
Define a new interface called ICalculator and apply the ServiceContractAttribute attribute to the interface with a Namespace value of "http://Microsoft.ServiceModel.Samples". Specifying the namespace explicitly is a best practice because it prevents the default namespace value from being added to the contract name.
ICalculator
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _ Public Interface ICalculator
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator
Declare a method for each of the operations the ICalculator contract exposes (add, subtract, multiply, and divide) within the interface and apply the OperationContractAttribute attribute to each method that you want to expose as part of the public WCF contract.
<OperationContract()> _ Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
[OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2);
The following code example shows a basic interface that defines a service contract.
Imports System ' Step 5: Add the Imports statement for the System.ServiceModel namespace Imports System.ServiceModel Namespace Microsoft.ServiceModel.Samples ' Step 6: Define a service contract. <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _ Public Interface ICalculator <OperationContract()> _ Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double <OperationContract()> _ Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double End Interface End Namespace
using System; // Step 5: Add the using statement for the System.ServiceModel namespace using System.ServiceModel; namespace Microsoft.ServiceModel.Samples { // Step 6: Define a service contract. [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { // Step7: Create the method declaration for the contract. [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } }
Now the interface is created, proceed to How to: Implement a Windows Communication Foundation Service Contract to implement the interface. For troubleshooting information, see Troubleshooting the Getting Started Tutorial.
I think the line that says:
calculator service exposes (add, subtract, multiply, and delete)
should be udpate to
calculator service exposes (add, subtract, multiply, and divide)
Note: changed delete to divideThis has been fixed. Thx, Brad (CDSUA)
When I create a new console project, a module with a Sub Main is created. The example doesn't show this setup. Is this normal? Could it be because of the Express edition I'm using. If so, how should it be done?
Thanks,
John