private string GetFaultAction(FaultContractWrapperException faultContractWrapper)
        {
            if (OperationContext.Current == null) // we are running outside a host
            {
                return(null);
            }

            string operationAction = OperationContext.Current.RequestContext.RequestMessage.Headers.Action;

            // for unhandled exception use the operation action
            if (faultContractWrapper == null)
            {
                return(operationAction);
            }

            Type faultContractType = faultContractWrapper.FaultContract.GetType();

            foreach (DispatchOperation operation in OperationContext.Current.EndpointDispatcher.DispatchRuntime.Operations)
            {
                if (operation.Action.Equals(operationAction, StringComparison.OrdinalIgnoreCase))
                {
                    foreach (FaultContractInfo fault in operation.FaultContractInfos)
                    {
                        if (fault.Detail == faultContractType)
                        {
                            return(fault.Action);
                        }
                    }
                }
            }
            return(operationAction);
        }
        /// <summary>
        /// Build the unshielded MessageFault.
        /// </summary>
        /// <param name="faultContractWrapper"></param>
        /// <returns></returns>
        private MessageFault BuildMessageFault(FaultContractWrapperException faultContractWrapper)
        {
            Type faultExceptionType            = typeof(FaultException <>);
            Type constructedFaultExceptionType = faultExceptionType.MakeGenericType(faultContractWrapper.FaultContract.GetType());

            //Encapsulate the FaultContract in the FaultException
            FaultException faultException =
                (FaultException)Activator.CreateInstance(
                    constructedFaultExceptionType,
                    faultContractWrapper.FaultContract,
                    new FaultReason(new FaultReasonText(faultContractWrapper.Message, CultureInfo.CurrentCulture)),
                    FaultCode.CreateSenderFaultCode(SoapException.ClientFaultCode.Name, SoapException.ClientFaultCode.Namespace));

            return(faultException.CreateMessageFault());
        }
 private void HandleFault(FaultContractWrapperException faultContractWrapper, ref Message fault)
 {
     try
     {
         MessageFault messageFault = BuildMessageFault(faultContractWrapper);
         fault = Message.CreateMessage(fault.Version, messageFault, GetFaultAction(faultContractWrapper) ?? fault.Headers.Action);
     }
     catch (Exception unhandledException)
     {
         // There was an error during MessageFault build process, so treat it as an Unhandled Exception
         // log the exception and send an unhandled server exception
         Guid handlingInstanceId = ExceptionUtility.LogServerException(unhandledException);
         HandleFault(unhandledException, ref fault, handlingInstanceId, null);
     }
 }
        private void HandleFault(Exception error, ref Message fault, Guid handlingInstanceId, FaultContractWrapperException faultContractWrapper)
        {
            MessageFault messageFault = BuildMessageFault(error, handlingInstanceId);

            fault = Message.CreateMessage(fault.Version, messageFault, GetFaultAction(faultContractWrapper) ?? fault.Headers.Action);
        }
        /// <summary>
        /// Build the unshielded MessageFault.
        /// </summary>
        /// <param name="faultContractWrapper"></param>
        /// <returns></returns>
        private MessageFault BuildMessageFault(FaultContractWrapperException faultContractWrapper)
        {
            Type faultExceptionType = typeof(FaultException<>);
            Type constructedFaultExceptionType = faultExceptionType.MakeGenericType(faultContractWrapper.FaultContract.GetType());

            //Encapsulate the FaultContract in the FaultException
            FaultException faultException =
                (FaultException)Activator.CreateInstance(
                    constructedFaultExceptionType,
                    faultContractWrapper.FaultContract,
                    new FaultReason(new FaultReasonText(faultContractWrapper.Message, CultureInfo.CurrentCulture)),
                    FaultCode.CreateSenderFaultCode(SoapException.ClientFaultCode.Name, SoapException.ClientFaultCode.Namespace));

            return faultException.CreateMessageFault();
        }
        private string GetFaultAction(FaultContractWrapperException faultContractWrapper)
        {
            if (OperationContext.Current == null) // we are running outside a host
            {
                return null;
            }

            string operationAction = OperationContext.Current.RequestContext.RequestMessage.Headers.Action;
            // for unhandled exception use the operation action
            if (faultContractWrapper == null)
            {
                return operationAction;
            }

            Type faultContractType = faultContractWrapper.FaultContract.GetType();
            foreach(DispatchOperation operation in OperationContext.Current.EndpointDispatcher.DispatchRuntime.Operations)
            {
                if (operation.Action.Equals(operationAction, StringComparison.InvariantCultureIgnoreCase))
                {
                    foreach(FaultContractInfo fault in operation.FaultContractInfos)
                    {
                        if (fault.Detail == faultContractType)
                        {
                            return fault.Action;
                        }
                    }
                }
            }
            return operationAction;
        }
 private void HandleFault(Exception error, ref Message fault, Guid handlingInstanceId, FaultContractWrapperException faultContractWrapper)
 {
     MessageFault messageFault = BuildMessageFault(error, handlingInstanceId);
     fault = Message.CreateMessage(fault.Version, messageFault, GetFaultAction(faultContractWrapper) ?? fault.Headers.Action);
 }
 private void HandleFault(FaultContractWrapperException faultContractWrapper, ref Message fault)
 {
     try
     {
         MessageFault messageFault = BuildMessageFault(faultContractWrapper);
         fault = Message.CreateMessage(fault.Version, messageFault, GetFaultAction(faultContractWrapper) ?? fault.Headers.Action);
     }
     catch (Exception unhandledException)
     {
         // There was an error during MessageFault build process, so treat it as an Unhandled Exception
         // log the exception and send an unhandled server exception
         Guid handlingInstanceId = ExceptionUtility.LogServerException(unhandledException);
         HandleFault(unhandledException, ref fault, handlingInstanceId, null);
     }
 }