Blue Theme Orange Theme Green Theme Red Theme
 
Dundas Dashboard
Home | Forums | Videos | Photos | Downloads | Blogs | E-Books | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Login Close
User Id:
Password:
 
Forgot Password
Forgot Username
Why Register
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
 Resources  
Close
 Our Network  
Close
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.

Technologies: .NET 1.0/1.1, .NET 1.0/1.1, .NET 1.0/1.1, XML,Visual C# .NET
Total downloads : 381
Total page views :  41056
Rating :
 3.88/5
This article has been rated :  8 times
   Print Read/Post comments Post a comment  Rate  
   Email to a friend  Bookmark  Similar Articles  Author's other articles  
Download Files:
IndigoException.zip
 
Become a Sponsor



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.


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.
Go.NET
Build custom interactive diagrams, network, workflow editors, flowcharts, or software design tools. Includes many predefined kinds of nodes, links, and basic shapes. Supports layers, scrolling, zooming, selection, drag-and-drop, clipboard, in-place editing, tooltips, grids, printing, overview window, palette. 100% implemented in C# as a managed .NET Control. Document/View/Tool architecture with many properties&events. Optional automatic layout.
Dundas Software
Dundas Chart for .NET is the most advanced .NET charting package available today.  With an extremely complete feature set, elegant architecture and easy implementation, Dundas Chart can quickly add advanced Charting functionality to enhance and transform ASP.NET and Windows Forms applications.  Whether you are implementing charting into internal projects, or building applications for clients, Dundas Chart offers advanced technology and advanced results to get the most out of data.
Clickatell's SMS Gateway
Clickatell's Developer Solutions allow you to SMS enable any website or application via a range of API's. Learn More about our API connections.
Free access to .NET Memory Management video
Everything you need to know about Garbage Collection, Temporary Objects, Fragmentation, Finalization and common causes of memory leaks in .NET. Watch the video here.
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010 offers more to developers than any other Visual Studio release. Work more productively and collaboratively-with greater control over your work at every step. The Beta 2 can give you a head start on achieving efficiency.
 
   Print Read/Post comments Post a comment  Rate  
   Email to a friend  Bookmark  Similar Articles  Author's other articles  
Download Files:
IndigoException.zip
 
 Post a Feedback, Comment, or Question about this article
Subject:  
Comment:  
Dundas Dashboard
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 | Delete | 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 | Delete | Modify | 
Exception Handling in WCF using Fault Contract by sachin On May 12, 2009
This helps
Reply | Email | Delete | 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 | Delete | Modify | 

 Hosted by MaximumASP  |  Found a broken link?  |  Contact Us  |  Terms & conditions  |  Privacy Policy  |  Site Map  |  Suggest an Idea  |  Media Kit
Current Version: 5.2009.6.2
 © 1999 - 2009  Mindcracker LLC. All Rights Reserved