Step 6: Create the console client application and name it as DurableServiceClient
Step 7: Add following reference to client application
- System.ServiceModel
- System.WorkflowService
[ServiceContract()] public interface ISimpleCalculator { [OperationContract] int Add(int num); [OperationContract] int Subtract(int num); [OperationContract] int Multiply(int num); [OperationContract] void EndPersistence(); }
using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.ServiceModel.Description; [Serializable] [DurableService()] public class SimpleCalculator :ISimpleCalculator { int currentValue = default(int); [DurableOperation(CanCreateInstance = true)] public int Add(int num) { return (currentValue += num); } [DurableOperation()] public int Subtract(int num) { return (currentValue -= num); } [DurableOperation()] public int Multiply(int num) { return (currentValue *= num); } [DurableOperation(CompletesInstance = true)] public void EndPersistence() { }
<system.serviceModel> <services> <service name="SimpleCalculator" behaviorConfiguration="ServiceBehavior"> <!-- Service Endpoints --> <endpoint address="" binding="wsHttpContextBinding" bindingConfiguration="browConfig" contract="ISimpleCalculator"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <persistenceProvider type="System.ServiceModel.Persistence.SqlPersistenceProviderFactory, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DurableServiceStore" persistenceOperationTimeout="00:00:10" lockTimeout="00:01:00" serializeAsText="true"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpContextBinding > <binding name="browConfig" > <security mode="None"></security> </binding> </wsHttpContextBinding> </bindings> </system.serviceModel> <connectionStrings> <add name="DurableServiceStore" connectionString="Data Source=saravanakumar;Initial Catalog =DurableServiceStore;Integrated Security=True"/> </connectionStrings>
[ServiceContract()]
public interface ISimpleCalculator
{
[OperationContract()]
int Add(int num1, int num2);
}
[OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.BeforeCall]
public int Add(int num1, int num2)
{
return num1 + num2;
}
[ServiceContract()]
public interface IMyService
{
[OperationContract]
void MyMethod();
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class MyService:IMyService
{
public void MyMethod()
{
//Do something
OperationContext.Current.InstanceContext.ReleaseServiceInstance();
}
}
[ServiceContract()] public interface IMyService { [OperationContract] int MyMethod(); }
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class MyService:IMyService { static int m_Counter = 0; public int MyMethod() { m_Counter++; return m_Counter; } }
static void Main(string[] args) { Console.WriteLine("Service Instance mode: Singleton"); Console.WriteLine("Client 1 making call to service..."); //Creating the proxy on client side MyCalculatorServiceProxy.MyServiceProxy proxy = new MyCalculatorServiceProxy.MyServiceProxy(); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Client 2 making call to service..."); //Creating new proxy to act as new client MyCalculatorServiceProxy.MyServiceProxy proxy2 = new MyCalculatorServiceProxy.MyServiceProxy(); Console.WriteLine("Counter: " + proxy2.MyMethod()); Console.WriteLine("Counter: " + proxy2.MyMethod()); Console.ReadLine(); }
[ServiceContract()] public interface IMyService { [OperationContract] int MyMethod(); }
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] public class MyService:IMyService { static int m_Counter = 0; public int MyMethod() { m_Counter++; return m_Counter; } }
static void Main(string[] args) { Console.WriteLine("Service Instance mode: Per-Session"); Console.WriteLine("Client making call to service..."); //Creating the proxy on client side MyCalculatorServiceProxy.MyServiceProxy proxy = new MyCalculatorServiceProxy.MyServiceProxy(); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.ReadLine(); }
[ServiceContract()] public interface IMyService { [OperationContract] int MyMethod(); }
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] public class MyService:IMyService { static int m_Counter = 0; public int MyMethod() { m_Counter++; return m_Counter; } }
static void Main(string[] args) { Console.WriteLine("Service Instance mode: Per-Call"); Console.WriteLine("Client making call to service..."); //Creating the proxy on client side MyCalculatorServiceProxy.MyServiceProxy proxy = new MyCalculatorServiceProxy.MyServiceProxy(); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.WriteLine("Counter: " + proxy.MyMethod()); Console.ReadLine(); }
//Service interface [ServiceContract()] public interface ISimpleCalculator { [OperationContract()] int Add(int num1, int num2); } //Service implementation public class SimpleCalculator : ISimpleCalculator { public int Add(int num1, int num2) { //Do something throw new Exception("Error while adding number"); } }
try { MyCalculatorServiceProxy.MyCalculatorServiceProxy proxy = new MyCalculatorServiceProxy.MyCalculatorServiceProxy(); Console.WriteLine("Client is running at " + DateTime.Now.ToString()); Console.WriteLine("Sum of two numbers... 5+5 =" + proxy.Add(5, 5)); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); }
public int Add(int num1, int num2) { //Do something throw new FaultException("Error while adding number"); }
[DataContract()] public class CustomException { [DataMember()] public string Title; [DataMember()] public string ExceptionMessage; [DataMember()] public string InnerException; [DataMember()] public string StackTrace; }
[ServiceContract()] public interface ISimpleCalculator { [OperationContract()] [FaultContract(typeof(CustomException))] int Add(int num1, int num2); }
public int Add(int num1, int num2) { //Do something CustomException ex = new CustomException(); ex.Title = "Error Funtion:Add()"; ex.ExceptionMessage = "Error occur while doing add function."; ex.InnerException = "Inner exception message from serice"; ex.StackTrace = "Stack Trace message from service."; throw new FaultException(ex,"Reason: Testing the Fault contract") ; }
try { MyCalculatorServiceProxy.MyCalculatorServiceProxy proxy = new MyCalculatorServiceProxy.MyCalculatorServiceProxy(); Console.WriteLine("Client is running at " + DateTime.Now.ToString()); Console.WriteLine("Sum of two numbers... 5+5 =" + proxy.Add(5, 5)); Console.ReadLine(); } catch (FaultException<MyCalculatorService.CustomException> ex) { //Process the Exception }
[MessageContract] public class EmployeeDetails { [MessageHeader] public string EmpID; [MessageBodyMember] public string Name; [MessageBodyMember] public string Designation; [MessageBodyMember] public int Salary; [MessageBodyMember] public string Location; }
[OperationContract] void SaveEmployeeDetails(EmployeeDetails emp);
[OperationContract] EmployeeDetails GetEmployeeDetails();
[OperationContract] EmployeeDetails ModifyEmployeeDetails(EmployeeDetails emp);
[ServiceContract] public interface IEmployeeService { [OperationContract] Employee GetEmployeeDetails(int EmpId); } [DataContract] public class Employee { private string m_Name; private int m_Age; private int m_Salary; private string m_Designation; private string m_Manager; [DataMember] public string Name { get { return m_Name; } set { m_Name = value; } } [DataMember] public int Age { get { return m_Age; } set { m_Age = value; } } [DataMember] public int Salary { get { return m_Salary; } set { m_Salary = value; } } [DataMember] public string Designation { get { return m_Designation; } set { m_Designation = value; } } [DataMember] public string Manager { get { return m_Manager; } set { m_Manager = value; } } }
public class EmployeeService : IEmployeeService { public Employee GetEmployeeDetails(int empId) { Employee empDetail = new Employee(); //Do something to get employee details and assign to 'empDetail' properties return empDetail; } }
protected void btnGetDetails_Click(object sender, EventArgs e) { EmployeeServiceClient objEmployeeClient = new EmployeeServiceClient(); Employee empDetails; empDetails = objEmployeeClient.GetEmployeeDetails(empId); //Do something on employee details }
[ServiceContract()] public interface ISimpleCalculator { [OperationContract()] int Add(int num1, int num2); }
public class SimpleCalculator : ISimpleCalculator { public int Add(int num1, int num2) { return num1 + num2; } }
[ServiceContract()] public class SimpleCalculator { [OperationContract()] public int Add(int num1, int num2) { return num1 + num2; } }
<system.serviceModel> <services> <service name="MyService"> <endpoint address="http://localhost/IISHostedService/MyService.svc" binding="wsHttpBinding" contract="IMyService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> </system.serviceModel>
ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(smb);
Binding mexBinding = MetadataExchangeBindings.CreateMexHttpBinding ();
host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");
//Create a URI to serve as the base address Uri httpUrl = new Uri("http://localhost:8090/MyService/SimpleCalculator"); //Create ServiceHost ServiceHost host = new ServiceHost(typeof(MyCalculatorService.SimpleCalculator), httpUrl); //Add a service endpoint host.AddServiceEndpoint (typeof(MyCalculatorService.ISimpleCalculator), new WSHttpBinding(), ""); //Enable metadata exchange ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(smb); Binding mexBinding = MetadataExchangeBindings.CreateMexHttpBinding (); //Adding metadata exchange endpoint host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex"); //Start the Service host.Open(); Console.WriteLine("Service is host at " + DateTime.Now.ToString()); Console.WriteLine("Host is running... Press key to stop"); Console.ReadLine();
<system.serviceModel> <services> <service behaviorConfiguration="ServiceBehavior" name="MyService"> <endpoint address="http://localhost/IISHostedService/MyService.svc" binding="wsHttpBinding" contract="IMyService"> <identity> <dns value="localhost"/> </identity> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <!-Setting httpGetEnabled you can publish the metadata --> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
//Create a URI to serve as the base address Uri httpUrl = new Uri("http://localhost:8090/MyService/SimpleCalculator"); //Create ServiceHost ServiceHost host = new ServiceHost(typeof(MyCalculatorService.SimpleCalculator), httpUrl); //Add a service endpoint host.AddServiceEndpoint (typeof(MyCalculatorService.ISimpleCalculator), new WSHttpBinding(), ""); //Enable metadata exchange ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); //Enable metadata exchange using HTTP-GET smb.HttpGetEnabled = true; host.Description.Behaviors.Add(smb); //Start the Service host.Open(); Console.WriteLine("Service is host at " + DateTime.Now.ToString()); Console.WriteLine("Host is running... Press key to stop"); Console.ReadLine();