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