Export (0) Print
Expand All
2 out of 14 rated this helpful - Rate this topic

IErrorHandler Interface

Allows an implementer to control the fault message returned to the caller and optionally perform custom error processing such as logging.

Namespace:  System.ServiceModel.Dispatcher
Assembly:  System.ServiceModel (in System.ServiceModel.dll)
public interface IErrorHandler

The IErrorHandler type exposes the following members.

  NameDescription
Public methodHandleErrorEnables error-related processing and returns a value that indicates whether the dispatcher aborts the session and the instance context in certain cases.
Public methodProvideFaultEnables the creation of a custom FaultException<TDetail> that is returned from an exception in the course of a service method.
Top

To explicitly control the behavior of the application when an exception is thrown, implement the IErrorHandler interface and add it to the ErrorHandlers property. IErrorHandler enables you to explicitly control the SOAP fault generated, decide whether to send it back to the client, and perform associated tasks, such as logging. Error handlers are called in the order in which they were added to the ErrorHandlers property.

Implement the ProvideFault method to control the fault message that is returned to the client.

Implement the HandleError method to ensure error-related behaviors, including error logging, assuring a fail fast, shutting down the application, and so on.

NoteNote

Because the HandleError method can be called from many different places there are no guarantees made about which thread the method is called on. Do not depend on HandleError method being called on the operation thread.

All ProvideFault implementations are called first, prior to sending a response message. When all ProvideFault implementations have been called and return, and if fault is non-null, it is sent back to the client according to the operation contract. If fault is null after all implementations have been called, the response message is controlled by the ServiceBehaviorAttribute.IncludeExceptionDetailInFaults property value.

NoteNote

Exceptions can occur after all ProvideFault implementations are called and a response message is handed to the channel. If a channel exception occurs (for example, difficulty serializing the message) IErrorHandler objects are not notified. In this case, you should make sure that your development environment catches and displays such exceptions to you or makes use of tracing to discover the problem. For more information about tracing, see Using Tracing to Troubleshoot Your Application.

After the response message has been sent, all HandleError implementations are called in the same order.

Typically, an IErrorHandler implementation is added to the ErrorHandlers property on the service (and the client in the case of duplex communication).

You can add the IErrorHandler to the runtime by implementing a behavior (either an System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IEndpointBehavior, System.ServiceModel.Description.IContractBehavior, or System.ServiceModel.Description.IOperationBehavior object) and use the behavior programmatically, from a configuration file or with a custom attribute to attach your IErrorHandler.

For more information about using behaviors to modify the runtime, see Attaching Extensions Using Behaviors.

The following code example demonstrates a service that implements IErrorHandler that returns only FaultException<TDetail> of type GreetingFault when a service method throws a managed exception.


	#Region "IErrorHandler Members"
	Public Function HandleError(ByVal [error] As Exception) As Boolean Implements IErrorHandler.HandleError
	  Console.WriteLine("HandleError called.")
	  ' Returning true indicates you performed your behavior.
	  Return True
	End Function

	' This is a trivial implementation that converts Exception to FaultException<GreetingFault>.
	Public Sub ProvideFault(ByVal [error] As Exception, ByVal ver As MessageVersion, ByRef msg As Message) Implements IErrorHandler.ProvideFault
	  Console.WriteLine("ProvideFault called. Converting Exception to GreetingFault....")
	  Dim fe As New FaultException(Of GreetingFault)(New GreetingFault([error].Message))
	  Dim fault As MessageFault = fe.CreateMessageFault()
	  msg = Message.CreateMessage(ver, fault, "http://microsoft.wcf.documentation/ISampleService/SampleMethodGreetingFaultFault")
	End Sub
	#End Region


The following code example shows how to use a service behavior to add the IErrorHandler implementation to the ErrorHandlers property.


	' This behavior modifies no binding parameters.
	#Region "IServiceBehavior Members"
	Public Sub AddBindingParameters(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase, ByVal endpoints As System.Collections.ObjectModel.Collection(Of ServiceEndpoint), ByVal parameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IServiceBehavior.AddBindingParameters
	  Return
	End Sub

	' This behavior is an IErrorHandler implementation and 
	' must be applied to each ChannelDispatcher.
	Public Sub ApplyDispatchBehavior(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.ApplyDispatchBehavior
	  Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.")
	  For Each chanDisp As ChannelDispatcher In serviceHostBase.ChannelDispatchers
		chanDisp.ErrorHandlers.Add(Me)
	  Next chanDisp
	End Sub

	' This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
	Public Sub Validate(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.Validate
	  Console.WriteLine("Validate is called.")
	  For Each se As ServiceEndpoint In description.Endpoints
		' Must not examine any metadata endpoint.
		If se.Contract.Name.Equals("IMetadataExchange") AndAlso se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex") Then
		  Continue For
		End If
		For Each opDesc As OperationDescription In se.Contract.Operations
		  If opDesc.Faults.Count = 0 Then
			Throw New InvalidOperationException(String.Format("EnforceGreetingFaultBehavior requires a " & "FaultContractAttribute(typeof(GreetingFault)) in each operation contract.  " & "The ""{0}"" operation contains no FaultContractAttribute.", opDesc.Name))
		  End If
		  Dim gfExists As Boolean = False
		  For Each fault As FaultDescription In opDesc.Faults
			If fault.DetailType.Equals(GetType(GreetingFault)) Then
			  gfExists = True
			  Continue For
			End If
		  Next fault
		  If gfExists = False Then
			Throw New InvalidOperationException("EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract.")
		  End If
		Next opDesc
	  Next se
	End Sub
	#End Region


The following code example shows how to configure the service to load the service behavior using an application configuration file. For more details about how to expose a service behavior in a configuration file, see IServiceBehavior.


<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metaAndErrors">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService"/>
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
         />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
         />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaAndErrors">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
          <enforceGreetingFaults />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add 
          name="enforceGreetingFaults" 
          type="Microsoft.WCF.Documentation.EnforceGreetingFaultBehavior, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>



<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metaAndErrors">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService"/>
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
         />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
         />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaAndErrors">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
          <enforceGreetingFaults />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add 
          name="enforceGreetingFaults" 
          type="Microsoft.WCF.Documentation.EnforceGreetingFaultBehavior, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>


.NET Framework

Supported in: 4, 3.5, 3.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

ADD
Show:
© 2014 Microsoft. All rights reserved.