DCSIMG
WCF – Advanced Error Handling and IErrorHandler - Zuker On Foundations

Zuker On Foundations

The realm of .NET (WPF, WCF and all around)
WCF – Advanced Error Handling and IErrorHandler

Update 02/02/10:
Please note the version displayed here doesn't reflect the version published to CodePlex, there were some changes and the behavior extension element was removed for the time being.
Check the Show Cases at CodePlex for code samples.

Update 24/03/09:
The attachment was updated with a new version. (Fixed a small bug)

 

The built-in extensibility point for handling errors is by implementing “IErrorHandler” interface and hooking it up into the channel dispatchers

    public interface IErrorHandler

    {

        bool HandleError(Exception error);

        void ProvideFault(Exception error, MessageVersion version, ref Message fault);

    }

- ProvideFault allows you to provide an alternative message fault to be returned to the client but this isn’t what the post is about.

- HandleError is the place where you would write your error handling logic, it usually ends up with some sort of logging. (whether it’s writing to a file / database / mail and so on)

My goal was to log much more than just the actual exception, to be specific, I was aiming for the following:
The client’s identity, the parameters sent to the service operation and the entire request message envelope.

Unfortunately, WCF doesn’t give you built-in access to fetch the last 2 in the scope of the ‘HandleError’ method.
You can access the OperationContext.Current in that scope to extract more information, I will address each of the subjects mentioned above:

  • The client’s identity
    You can access the service security context attached to the operation context and extract the identity information from there.
    Oddly enough, in some case where there would be no context available, trying to access the security context will throw an ‘ObjectDisposedException’ so you need to handle this accordingly.
  • The input parameters
    There is no built-in way to access this information from this scope
  • The request message
    You can access the request message on the request context. However, it is in a closed state so you can’t really do much with it.

So that is the problem at hand..

Luckily, WCF is such an extensible and pluggable framework, I love it :)
I wrote more behaviors, hooked up into the WCF pipeline in the right places and made this work.

Feel free to download the attached project to see this in action.

I wrapped the solution in a way that it could be easily used, let’s take a look at it:

First, you must get acquainted with your custom implementation point:

public class ErrorDetails

{

    public ServiceSecurityContext SecurityContext { get; }

    public Message RequestMessage { get; }

    public object[] Parameters { get; }

}

 

public interface IErrorDetailsHandler

{

    void HandleError(Exception error, ErrorDetails details);

}

As you can see, there is a new interface in town - “IErrorDetailsHandler”.
This should be your custom implementation, no need to implement IErrorHandler on your own. (Unless you wish to do something in the ProvideFault method)
As you might have guessed, I handled the security context ‘ObjectFaultedException’ occurence under the covers so you don’t need to worry about it.

Here is a really dummy class that implements this behavior:

namespace MyServices

{

    public class MyErrorDetailsHandler : IErrorDetailsHandler

    {

        public void HandleError(Exception exception, ErrorDetails details)

        {

            //handle the error as you see fit..

        }

    }

}


Now all that is left is to plug our details handler into the WCF using my infrastructure.

I’ve enabled several ways to do that – behavior / attribute / configuration

Let’s look at all 3 ways, pick the one which fits your needs the most.

  1. Plugging the behavior into the service description
    Once we create the service host, we can insert the behavior before opening it, as follows:

    myHost.Description.Behaviors.Add(
        new ServiceErrorHandlerBehavior("MyServices.MyErrorDetailsHandler, MyServices", true));
  2. Using a service-level attribute
  3. [ServiceErrorHandler("MyServices.MyErrorDetailsHandler, MyServices", true)]

    class Service : IService

    { }

     

  4. Using the configuration

    <system.serviceModel>

      <behaviors>

        <serviceBehaviors>

          <behavior name="ErrorHandler">

            <errorHandlerExtension createMessageBuffer="true"
                                   errorDetailsHandlerTypeName="MyServices.MyErrorDetailsHandler, MyServices" />

          </behavior>

        </serviceBehaviors>

      </behaviors>

      <extensions>

        <behaviorExtensions>

          <add name="errorHandlerExtension"

               type="WcfContrib.Errors.ServiceErrorHandlerBehaviorExtensionElement, WcfContrib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=242f357400093587" />

        </behaviorExtensions>

      </extensions>

      <services>

        <service name="MyService" behaviorConfiguration="ErrorHandler">

          <endpoint address="<address>"

                    contract="<contract>"

                    binding="basicHttpBinding" />

        </service>

      </services>

    </system.serviceModel>

The last thing left to discuss are the parameters the behavior receives -

  1. ErrorDetailsHandlerTypeName (string)
    The type name of your custom error details class – this is required.
    Note that the class needs to have a public parameter-less constructor.
  2. CreateMessageBuffer (bool)
    Indicates whether you need to access the request message, this isn’t required.
    This defaults to false! This is because it creates a copy of the original request so you could access it later on and such processing shouldn’t be done unless you actually need it.

So that is it.. you can now easily access and log this information which could be of great assistance.

Note that this is one of the features of a future project I plan to release to CodePlex, so keep your eyes and ears open :)

To download the attached project,make sure you enter the post specific page.

Published Monday, March 23, 2009 12:37 AM by Amir Zuker
תגים:,

Comments

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, April 01, 2009 3:02 AM

Good article

Sravan

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, May 01, 2009 6:08 AM

Excellent article, I have been looking for something like this for a while, well done.  A sample application is worth a thousand words!

Took me a a moment or two to nut out that WcfContrib.dll needs to go in the GAC, kind of a no go for virtually hosted solutions but I read that this will be addressed in a future release...  

Stephen Davies

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, May 01, 2009 3:08 PM

Hi Stephen,

It is recommended you get the latest version from CodePlex (http://wcfcontrib.codeplex.com)

Thanks

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Monday, June 22, 2009 4:00 PM

For accessing the request message, what do you think about creating an instance inside your ErrorBehavior class and assigning it the request message on ProvideFault and using that on HandleError to log the message?

T

# re: WCF – Advanced Error Handling and IErrorHandler@ Tuesday, September 22, 2009 5:03 AM

1cvomv0yC http://gogole.com/?1cvomv0yD <a href='http://gogole.com/?1cvomv0yE'>1cvomv0yF</a> [url=http://gogole.com/?1cvomv0yG]1cvomv0yH[/url]

1cvomv0yA

# re: WCF – Advanced Error Handling and IErrorHandler@ Monday, December 07, 2009 2:01 AM

This is my first word :)

<a href=http://babagala.maga.net>Hi</a>

EnetteQuiesse

# re: WCF – Advanced Error Handling and IErrorHandler@ Tuesday, February 02, 2010 12:44 PM

Hi,

WCFContrib is surely a good project, but there is something I don't understand :

Why in the version of august 2009 of WCFContrib this configuration doesn't work anymore ? It was a good idea, but it doesn't work anymore like this...

Could you tell us how to configure something similar with the Version=2.0.0.0 of WCFContrib please ?

Guillaume Bibaut

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, February 10, 2010 7:30 PM

Hi Guillaume,

v2.0 doesn't include a configuration extension for the error handlers.

However, I advise you to download the new version (v2.1) from CodePlex which does include a configuration for it.

There's a working sample in the Show Cases if you like to see, here's the configuration sample:

<system.serviceModel>

   <services>

     <service name="MyService" behaviorConfiguration="ServiceErrorContextHandlerBehavior">

       <endpoint address="localhost/.../Service"

                 contract="Contracts.IService"

                 binding="basicHttpBinding" />

     </service>

   </services>

   <behaviors>

     <serviceBehaviors>

       <behavior name="ServiceErrorContextHandlerBehavior">

         <ErrorContextHandlerBehavior>

           <handlers>

             <handler typeName="WcfContrib.Showcase.Service.MyErrorHandler, WcfContrib.Showcase.Service" />

           </handlers>

         </ErrorContextHandlerBehavior>

       </behavior>

     </serviceBehaviors>

   </behaviors>

   <extensions>

     <behaviorExtensions>

       <add name="ErrorContextHandlerBehavior" type="WcfContrib.Errors.ErrorContextHandlerExtensionElement, WcfContrib, Version=2.1.0.0, Culture=neutral, PublicKeyToken=242f357400093587" />        

     </behaviorExtensions>

   </extensions>

 </system.serviceModel>

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 4:12 AM

SecurityContext is always null.  I am not able to get the operationcontext details since securitycontext is null.

Please let me know what I am missing. I am using your latest code from codeplex

thanks

chen

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 12:43 PM

Hi Chen,

In cases where the security context usually indicates that you are using a non-secured binding to communicate between the client and service.

For example, using the basicHttpBinding in its default form is configured with anonymous access.

If you are using a binding with some sort of security policy defined, please contact me and I'll take a look at the code if that's possible.

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 2:56 PM

Amir,

    You are really great. I appreciate your quick response. Your solution worked like a charm. I changed the binding from basic to wsHttpBinding and now SecurityCOntext has values in it.

But I have another issue. RequestMessage of SecurityContext if throwing the error "System.ObjectDisposedException" and shows the state as closed. Please let me know what should I do to get values in RequestMessage

Thanks

Chen

chen

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 4:42 PM

Hi Chen,

The WCF message is designed where it can be read only once.

In most cases the request message will be read and may be closed too until you reach the error handling implementation, that is why you're experiencing the ObjectDisposedException.

If you do need the request message, you should use the infrastructure in WcfContrib that provides you with that.

You do it by returning the desired message access mode property in your error context handler implementation.

For example:

class MyErrorHandler : IErrorContextHandler

{

   public void HandleError(Exception error, ActivationErrorContext errorContext)

   {

   }

   public WcfContrib.Extensions.MessageAccessMode RequiredMessageAccess

   {

       get { return WcfContrib.Extensions.MessageAccessMode.Read; }

   }

}

Cheers,

Amir Zuker

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 7:37 PM

Amir,

    Thankyou so much for explaining with an example. It worked. You are gr8!

Thanks

Chen

chen

# re: WCF – Advanced Error Handling and IErrorHandler@ Friday, February 19, 2010 8:12 PM

HI Amir,

I dont see ProvideFault method in your WCFCOntrib.

How do I create a custom FaultException(Of Type ) that is returned from an exception in the course of a service method. I need to wrap a new message that will be sent back to the client verses the exact service error.

Say for example I have a custom faultcontract named DabatabseFault . How do I wrap custom messages without the method ProvideFault. Instaed of original msg all I want to pass is a custom msg say "Service Failure Contact Service Provider" in my FaultException that will be trapped on the client side in a try catch. Please let me know

try

{

}

catch (FaultException(Of DatabaseFault)

{

}

DatabaseFault is a datacontract that has the properties

        <DataMember(Name:="methodname", Order:=0)> _

       Public Property MethodName() As String

           Get

               Return m_methodname

           End Get

           Set(ByVal value As String)

               m_methodname= value

           End Set

       End Property

       <DataMember(Name:="cusmsg", Order:=1)> _

       Public Property CustomMsg() As List(Of String)

           Get

               Return m_cusmsg

           End Get

           Set(ByVal value As List(Of String))

               m_cusmsg= value

           End Set

       End Property

Scott

# re: WCF – Advanced Error Handling and IErrorHandler@ Saturday, February 20, 2010 5:18 AM

HI,

  I have two questions. Can you please give me a working solution

1) When I have a ByRef parameter in my operation, the value is not getting returned in errorContext.Parameters when an exception occurs

Sub GetDetails(ByRef name as String)

 throw new ArgumentNullException("Test")

End Sub

2) How do I get the value in my errorContext.Parameters. Say the values returned in my Parameters are

errorContext.Parameters[0]

{Contracts.Foo}

   Id: 1

   Name: "Some Foo"

errorContext.Parameters[1]

"Hello"

How do I get the value of Id and Name which is in Parameters[0]

say when I use reflection I can get the Name and Value separately, where Name = "Id" and Value="1". How can I do this from Parameters of your errorContext Object

thanks

mitri

# re: WCF – Advanced Error Handling and IErrorHandler@ Saturday, February 20, 2010 7:31 PM

Hi Scott,

Unfortunately, the "ProvideFault" functionality from the original WCF error behavior was stripped down from the error context handler of WCF Contrib.

The reason is that the error context handler was designed to simply process the error information in some sort and that's all.

It is being considered to add the ProvideFault in a future release. Until then, you can implement the original WCF error behavior with ProvideFault and attach the behavior to your service.

You can check the following resources for reference:

msdn.microsoft.com/.../system.servicemodel.dispatcher.ierrorhandler.aspx

msdn.microsoft.com/.../ms751439.aspx

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Saturday, February 20, 2010 7:42 PM

Hi Mitri,

This should work with by-ref parameters as well.

The parameters that are included within the error context are the parameter values that are passed to the service operation.

I'm not sure exactly what you mean, It is up to you to decide what to do with these parameters in the state of your context handler.

Please try to explain more if I didn't understand correctly,

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Sunday, February 21, 2010 3:56 PM

Thanks for your response Amir. MY issue is when the paramter passed to the service operation is ByRef (Vb.NET) out(C#)

the errorcontext is not including the parameter in its collection. Example

void Do(Foo foo, out string tname);

Here length of errorcontext.parameter.length will be 1 and will have th value of only foo and not tname

errorcontext.Paramater[0] = {Contracts.Foo}

  Id: 1

  Name: "Some Foo"

I need to see the value of tname which is out/byref parameter in

errorcontext.Parameter[1], but it is not returning since it is out paramter

My Second question

-------------------

In the example above, the parameters in errorcontext will be

errorcontext.Paramater[0] = {Contracts.Foo}

  Id: 1

  Name: "Some Foo"

the Id and Name are in Parameter[0] as one collection. Now to log them as separate items one row at a time, i need to get the name as "Id" and value as "1" and teh second row with name as "Name" and value as "Some Foo". How do I separate them like this from

Parameter[0]

I need to read the Id and Name as two separate rows and get the name as "Id" and value as "Some Foo"

say when I use reflection I can read the properties as

Dim properties_info As PropertyInfo() =       cusObj.GetProperties()

Now I can iterate through the properties to read the name and value separately. In the case of reflection the value of your foo object will be stiored as

properties(0).Name = "Id"

properties(0).GetValue = "1"

properties(1).Name = "Name"

properties(1).GetValue = "Some Foo"

Mitri

# re: WCF – Advanced Error Handling and IErrorHandler@ Sunday, February 21, 2010 5:33 PM

Hi Mitri,

Regarding your first question -

It is true that you will not get the values for parameters defined as "out" parameters.

This is by design and resembles the same behavior as WCF's IParameterInspector provides.

Out parameters are parameters that should be initialized in the target operation, so the actual value that was sent to the operation should not be relevant anyway.

Regarding your second question -

WCF Contrib provides you with the parameter values alone, it doesn't do any exploring on the parameter type using reflection.

If you want to get a specialized string representation of your object, you can either:

1) Perform "ToString" where the object is not null and ensure you implement it in your objects as needed.

2) A more advanced scenario, you can use a more sophisticated approach of dumping the object such as reflection utilities or a serialization technique.

  2.1) However, you should think about different parameters where you may not want to dump their whole data because it may get expensive.

Hope that helps,

Amir Zuker

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Monday, February 22, 2010 4:04 PM

My situation is , my out parameter serves as both in and out parameter. I will be passing in some input and getting the modified results back in the same parameter.

If the error occurs before I modify the values of out param, I need to know the input that I passed in the out param, to log them.

How do you handle this situation?

mitri

# re: WCF – Advanced Error Handling and IErrorHandler@ Monday, February 22, 2010 4:41 PM

Mitri, In this case you should define your parameter as "ref" (C#) instead of "out", because this is essentially your design.

Parameters defined as "ref" will be included in the parameters collection of the error context.

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, February 24, 2010 6:10 PM

Amir,

    As per your response above dated

re: WCF – Advanced Error Handling and IErrorHandler@ Saturday, February 20, 2010 7:31 PM

I am having issues in implementing the  original WCF error behavior with ProvideFault and attaching the behavior to my service.

Please show me how can I implement your code as well providefault from the original IErrorHandler. I am lost

Thanks

Scott

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, February 24, 2010 7:41 PM

Hi Scott,

Following is an example that should do the trick.

- MyErrorHandlerFaultProvider is the error context handler and fault provider (by implementing both interfaces).

- MyErrorHandlerFaultProviderBehaviorAttribute is the behavior that attaches it to the service

public class MyErrorHandlerFaultProvider : IErrorContextHandler, IErrorHandler

{

   #region IErrorContextHandler Members

   void IErrorContextHandler.HandleError(Exception error, ActivationErrorContext errorContext)

   {

       //Implement whatever you need as the error context handler..

   }

   MessageAccessMode IErrorContextHandler.RequiredMessageAccess

   {

       get { return MessageAccessMode.None; }

   }

   #endregion

   #region IErrorHandler Members

   public bool HandleError(Exception error)

   {

       //Do nothing here since our error handling logic is part of the error context handler

       return false;

   }

   public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)

   {

       //Implement whatever you need..

   }

   #endregion

}

public class MyErrorHandlerFaultProviderBehaviorAttribute : Attribute, IServiceBehavior

{

   public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)

   { }

   public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)

   {

       MyErrorHandlerFaultProvider myHandler = new MyErrorHandlerFaultProvider();

       foreach (ChannelDispatcher d in serviceHostBase.ChannelDispatchers)

       {

           d.ErrorHandlers.Add(myHandler);

       }

       ErrorContextHandlerBehavior.AddContextHandler(serviceDescription, myHandler);

   }

   public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)

   { }

}

[MyErrorHandlerFaultProviderBehavior]

class Service : IService

{ ... }

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 24, 2010 4:12 PM

HI Amir,

       I would like to know if there is a way for me to supress specific fault message and log them.

Say for example. If InvalidOperationException is thrown, I just need to log this and not promote this to the caller. But if I am getting any  NullReferenceException then I need to log this and promote this exception as a fault to the service consumer.

Could you please let me know how to do this.

I know implementing HandleError with return false and not implementing providefault will suppress.

But my requirement is I want to supress only specific exception whereas promote the rest

Please let me know

thanks

mike

Mike

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 24, 2010 5:18 PM

Hi Mike,

What do you mean by suppressing the exception?

1) The exception won't even reach the client and the operation would seem as if it was successful

OR

2) The fact that next error handlers won't be called (this what returning false actually affects)

If by promotion you mean to return a specific fault message of your wish, the implementation point should be at the ProvideFault method of your IErrorHandler implementation. (You can change the fault message if the exception is NullReferenceException for example)

You can check MSDN for more details:

msdn.microsoft.com/.../system.servicemodel.dispatcher.ierrorhandler.providefault.aspx

Amir Zuker

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 24, 2010 6:40 PM

Amir,

     My requirement is, when there is an exception say InvalidOperationException , I need to log (I do thi in HandleError). I dont want the client to see the error, it should look like the operation was successfull without faultexception being thrown. (#1 of your response)

If my error is NullReferenceException, then I need to log this (HandlError) and the client should be able to catch this as faultexception

Mike

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 24, 2010 8:44 PM

Mike,

I hope the exception types presented here are just theoretical, otherwise it would be generally considered as a bad design.

Having said that, I can continue :)

Logging the error is easy, you do it in the "HandleError" method and everything works as I understand.

Regarding creating a specific fault for a certain exception, that is possible to do by setting the fault message in the "ProvideFault" method.

That leaves us with the part of suppressing the error -

First of all, you should ask yourself if this is truly the behavior that you want. Exceptions should be thrown when erroneous behavior or state is met, and should be propagated back to the client in most cases.

If you want to do it according to a specific exception, I suppose somewhere in the code you throw that. In that case, you may want to consider not throwing an exception at all if the operation is considered to have completed just fine and just log what you need there.

Assuming that the original requirement you presented is the final solution that you would like to implement, IErrorHandler won't help you with that as far as I know.

You can however, implement an IOperationInvoker that you can attach to the operations you wish this behavior will be applied to. Your invoker can simply invoke the inner invoker and wrap it with a try/catch block and do whatever you like such as suppressing it and not re-throwing it.

You can see a sample of an IOperationInvoker in the following link:

msdn.microsoft.com/.../cc163302.aspx

Hope that helps,

Amir Zuker

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Tuesday, March 30, 2010 4:27 PM

Amir,

I am getting ObjectDisposedException, "Messagebuffer is closed" though I am setting the message access mode as you have specified in this thread

get { return WcfContrib.Extensions.MessageAccessMode.Read; }

My Scenario:-

I am using your test code. I have made small change as shown below in Do method of Service.cs. If the object that is passed to the method is null then I need to throw the ArgumentNullException and catch it in HandleError. Please let me know what should I be doing to avoid this error.

public void Do(Foo foo, ref string tname)

{

   if (foo == null )

   {

       throw new ArgumentNullException ("pname", "mname");

   }

}

chen

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 31, 2010 6:06 PM

Amir,

    I have an issue with wcfcontrib. When an error is thrown the HandleError method of wcfcontrib is being called twice. I need this to be invoked only once when an error occurs.

public void HandleError(Exception error, ActivationErrorContext errorContext)

{

}

public bool HandleError(Exception error)

{

   return false;

}

public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)

{

// my code here

}

mike

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 31, 2010 9:54 PM

Hi Mike,

I couldn't reproduce the problem you're describing.

Are you sure the exception is thrown from the HandleError of WcfContrib's IErrorContextHandler interface?

You should consider implementing the HandleError where it shouldn't throw any exception. This goes in both cases, it is considered the best practice for the basic WCF interface as well.

If you do that, you shouldn't encounter any problem.

That is my recommendation. You should fix the cause for the errors, may be even use a try/catch block and log the error somewhere and not re-throw it.

If you still like me to check it, please send me a sample where I can reproduce it. (You can contact me through the 'Contact' form here too, if you need to send attachments, I'll reply and you can send me whatever you like)

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Wednesday, March 31, 2010 9:58 PM

Hi Chen,

It does seem like a possible bug.

Can you please provide me with an example that produces this exception? (You can contact me through the 'Contact' form too, if you need to send attachments, I'll reply and you can send me whatever you like)

Thanks,

Amir Zuker

Amir Zuker

# re: WCF – Advanced Error Handling and IErrorHandler@ Thursday, April 01, 2010 5:13 AM

Amir,

   I appreciate your help. I have sent the code through 'Contact' form. Please let me know what should I do handle this situation.

Thanks

chen

# re: WCF – Advanced Error Handling and IErrorHandler@ Thursday, April 01, 2010 6:18 PM

Amir,

     I have sent the sample code to your email with the subject "HandleError".

Please check if it has gone into spam folder if you cant find in inbox.

Thanks

Chen

Leave a Comment

(required) 
(required) 
(optional)
(required) 

Enter the numbers above: