Blue Theme Orange Theme Green Theme Red Theme
 
Home | Forums | Videos | Advertise | Certifications | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
Discover the top 5 tips for understanding .NET Interop
Search :       Advanced Search »
Home » WCF » Exception Handling in WCF using Fault Contract

Exception Handling in WCF using Fault Contract

This article demonstrates how to get error information from a service to a client using fault contract in WCF.

Page Views : 138594
Downloads : 1326
Rating :
 Rate it
Level : Intermediate
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
IndigoException.zip
 
 
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor
 Tag Cloud
 Latest Jobs
More ... 
 Latest Interview Questions
More ... 

Introduction

In all managed applications, processing errors are represented by Exception objects. In WCF applications, service methods communicate processing error information using SOAP fault messages. SOAP faults are message types that are included in the metadata for a service operation and, therefore, create a fault contract that clients can use to make their operation more interactive. In addition, because SOAP faults are expressed to clients in XML form, they are highly interoperable.

To be more concrete, let us start with an example:

Create an empty solution in VS2005 called "IndigoException". Add one project called "IndigoService". Next add a reference to System.ServiceModel and then add an interface.

using System;

using System.Collections.Generic;

using System.Text;

using System.ServiceModel;

using System.Runtime.Serialization;

namespace Indigo

{

    [ServiceContract()]

    public interface IService

    {

        [OperationContract]

        [FaultContract(typeof(MyFaultException))]

        string GetMessage();

    }
}

Add one more class as follows:


using
System;

using System.Text;

using System.Runtime.Serialization;

namespace Indigo

{

    [DataContract]

    public class MyFaultException

    {

        private string _reason;

 

        [DataMember]

        public string Reason

        {

            get { return _reason; }

            set { _reason = value; }

        }

    }

}

Add one class "Service" and a reference to System.ServiceModel

using System;

using System.Collections.Generic;

using System.Text;

using System.ServiceModel;

namespace Indigo

{

    public class Service : IService

    {

        #region IService Members

         public string GetMessage()

        {

            try

            {

                int i, j, k;

                j = 1;

                 k = 0;

                i = j / k;

            }

            catch (Exception exp)

            {

                MyFaultException theFault = new MyFaultException();

                theFault.Reason = "Some Error " + exp.Message.ToString();

                throw new FaultException<MyFaultException>(theFault);

            }

            return "No Error";

        }

 

        #endregion

    }

} 

Build the project.

Now add another project "Host" and add reference to "IndigoService" project and to System.ServiceModel

using System;

using System.Collections.Generic;

using System.Text;

using System.ServiceModel;

 

namespace Indigo

{

    class IndigoHost

    {

 

        internal static ServiceHost myServiceHost = null;

        static void Main(string[] args)

        {

            StartService();

            Console.WriteLine("Service at your service");

            Console.ReadKey();

            StopService();

        }

        internal static void StartService()

        {

            myServiceHost = new ServiceHost(typeof(Indigo.Service));

            myServiceHost.Open();

        }

 

        internal static void StopService()

        {

            //Call StopService from your shutdown logic (i.e. dispose method)

            if (myServiceHost.State != CommunicationState.Closed)

                myServiceHost.Close();

        }

    }

}

Add app.config with the following XML:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <services>

      <service behaviorConfiguration="MyServiceTypeBehaviors" name="Indigo.Service">

        <endpoint address="Service"  binding="wsHttpBinding" contract="Indigo.IService" />

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:1111/Indigo" />

          </baseAddresses>

        </host>

      </service>

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior name="MyServiceTypeBehaviors">

          <serviceMetadata httpGetEnabled="true" />

          <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

  </system.serviceModel>
</configuration>

Build the project.Run Host.exe from VS2005 command prompt. You should get the message at the command prompt as follows:



Add another project "IndigoClient" and add System.ServiceModel

Now add service refrence to the service URL (i.e. http://localhost:1111/Indigo)

It will create localhost.cs in service reference.

Add a class Program.cs as follows:

using System;

using System.Collections.Generic;

using System.Text;

using System.ServiceModel;

 

namespace Indigo

{

    class Program

    {

        static void Main(string[] args)

        {

            string result = "";

            try

            {

                IndigoClient.localhost.IService ww = new IndigoClient.localhost.ServiceClient
                ();

                result = ww.GetMessage();

            }

            catch (FaultException<IndigoClient.localhost.MyFaultException> ee)

            {

               result = "Exception: " + ee.Detail.Reason;

            }

            Console.WriteLine(result);

            Console.ReadLine();           

        }

    }

}


Add app.config with following XML


<?
xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <bindings>

      <wsHttpBinding>

        <binding name="WSHttpBinding_IService" closeTimeout="00:01:00"

            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"

            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"

            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"

            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"

            allowCookies="false">

          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"

              maxBytesPerRead="4096" maxNameTableCharCount="16384" />

          <reliableSession ordered="true" inactivityTimeout="00:10:00"

              enabled="false" />

          <security mode="Message">

            <transport clientCredentialType="Windows" proxyCredentialType="None"

                realm="" />

            <message clientCredentialType="Windows" negotiateServiceCredential="true"

                algorithmSuite="Default" establishSecurityContext="true" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

    <client>

      <endpoint address="http://localhost:1111/Indigo/Service" binding="wsHttpBinding"

          bindingConfiguration="WSHttpBinding_IService" contract="IndigoClient.localhost.IService"

          name="WSHttpBinding_IService">

        <identity>

          <userPrincipalName value="name@domain.com" />

        </identity>

      </endpoint>

    </client>

  </system.serviceModel>

</configuration>

Note: Please add your username and domain name under userPrincipalName

Now run the client project; you should get following error message:



You can now see the detailed error message returned from the service.

Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.
Login to add your contents and source code to this article
 [Top] Rate this article
 
 About the author
 
Anand Thakur

 

Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Discover the Top 5 .NET Memory Management Fundamentals
To write the best .NET code, you need to know exactly how the .NET framework really manages memory. Ricky Leeks presents the Top 5 fundamental facts of .NET memory management. Learn more.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
ASP.NET 4 Hosting
Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites – Click Here!
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor
 Comments
Very Nice by Firoz On October 8, 2008
Nice and simple solution. Works for me! Can one retrieve the method name/ module name when raising exceptions? This would be great for more advanced fault reporting.
Reply | Email | Modify 
Re: Very Nice by Anand On October 8, 2008

Yes you can

try to explore given code, Atleast you put informations here

MyFaultException theFault = new MyFaultException();
theFault.Reason = "Some Error " + exp.Message.ToString();
throw new FaultException<MyFaultException>(theFault);

Reply | Email | Modify 
Exception Handling in WCF using Fault Contract by sachin On May 12, 2009
This helps
Reply | Email | Modify 
Good Article... But this code may not run!!! by Chiranjib On July 20, 2009
Hi,

This is really a good article for beginners. But one important thing is missing in it. If somebody try to run the sample application he may get the error "System.ServiceModel.FaultException`1 was unhandled by user code". If somebody experiences this, he need to change debugging settings of his "VS Environment".
Those are as follows:
1. Uncheck "Enable Exception Assistant"
2. Uncheck "Enable just My Code (Managed Only)"

To do this go to Tools -> options -> Debugging -> General.

For more information consult the following link:
http://sergecalderara.wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/
Reply | Email | Modify 
Re: Good Article... But this code may not run!!! by Vishal On July 13, 2010
Hi,

Perform below steps

1) Host the Web service on IIS

2) Delete the previous Service reference from the client

3) Add new service reference using the IIS hosted path.

try this & it will work
Reply | Email | Modify 
very nice explain by neelesh On August 19, 2010

very  nice explain and easily expained..thanks c-sharpcorner

Reply | Email | Modify 
Nevron Chart
 © 2012  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.