1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4 
5 namespace System.ServiceModel.Dispatcher
6 {
7     using System.ServiceModel.Channels;
8     using System.Diagnostics.CodeAnalysis;
9 
10     abstract class DurableErrorHandler : IErrorHandler
11     {
12         bool debug;
13 
DurableErrorHandler(bool debug)14         public DurableErrorHandler(bool debug)
15         {
16             this.debug = debug;
17         }
18 
CleanUpInstanceContextAtOperationCompletion()19         public static void CleanUpInstanceContextAtOperationCompletion()
20         {
21             if (OperationContext.Current == null)
22             {
23                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR2.NoOperationContext));
24             }
25 
26             DurableMessageDispatchInspector.SuppressContextOnReply(OperationContext.Current);
27             OperationContext.Current.InstanceContext.IncomingChannels.Clear();
28         }
29 
HandleError(Exception error)30         public bool HandleError(Exception error)
31         {
32             return IsUserCodeException(error);
33         }
34 
35         [SuppressMessage("Microsoft.Globalization", "CA1304")]
ProvideFault(Exception error, MessageVersion version, ref Message fault)36         public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
37         {
38             if (fault == null && IsUserCodeException(error))
39             {
40                 FaultCode code = new FaultCode(FaultCodeConstants.Codes.InternalServiceFault, FaultCodeConstants.Namespaces.NetDispatch);
41                 code = FaultCode.CreateReceiverFaultCode(code);
42 
43                 string action = FaultCodeConstants.Actions.NetDispatcher;
44                 MessageFault messageFault;
45 
46                 if (this.debug)
47                 {
48                     Exception toTrace = GetExceptionToTrace(error);
49                     messageFault = MessageFault.CreateFault(code, new FaultReason(toTrace.Message), new ExceptionDetail(toTrace));
50                 }
51                 else
52                 {
53                     string reason = SR.GetString(SR.SFxInternalServerError);
54                     messageFault = MessageFault.CreateFault(code, new FaultReason(reason));
55                 }
56                 fault = Message.CreateMessage(version, messageFault, action);
57             }
58         }
59 
GetExceptionToTrace(Exception error)60         protected virtual Exception GetExceptionToTrace(Exception error)
61         {
62             return error;
63         }
64 
IsUserCodeException(Exception error)65         protected abstract bool IsUserCodeException(Exception error);
66     }
67 }
68