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); } }