void HandleFault(
            Exception error,
            ref Message fault,
            Guid handlingInstanceId,
            FaultContractWrapperException faultContractWrapper = null)
        {
            if (fault == null)
            {
                throw new ArgumentNullException(nameof(fault));
            }

            if (_wcfContext.HasWebOperationContext)
            {
                BuildHttpResponseMessage(
                    $"An error has occurred while consuming this service. Please contact your administrator for more information. Error ID: {GetHandlingInstanceId(error, handlingInstanceId)}",
                    fault.Headers.Action,
                    HttpStatusCode.InternalServerError,
                    ref fault);
            }
            else
            {
                fault = Message.CreateMessage(
                    fault.Version,
                    new FaultException(
                        new FaultReason(
                            new FaultReasonText($"An error has occurred while consuming this service. Please contact your administrator for more information. Error ID: {GetHandlingInstanceId(error, handlingInstanceId)}")),
                        FaultCode.CreateReceiverFaultCode(
                            SoapException.ServerFaultCode.Name,
                            SoapException.ServerFaultCode.Namespace))
                    .CreateMessageFault(),
                    _wcfContext.GetFaultedAction(faultContractWrapper?.FaultContract?.GetType()) ?? fault.Headers.Action);
            }
        }
示例#2
0
        public void ShouldGetReplacedExceptionMessage()
        {
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), "NewValue", null);
            Exception exception = new Exception("MyException");
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            Assert.AreEqual("NewValue", result.Message);
        }
        public void CanCreateInstanceWithFaultContract()
        {
            MockFaultContract faultContract = new MockFaultContract();
            FaultContractWrapperException instance = new FaultContractWrapperException(faultContract);

            Assert.IsNotNull(instance);
            Assert.AreEqual(faultContract, instance.FaultContract);
        }
        public void CanCreateInstanceWithFaultContract()
        {
            MockFaultContract             faultContract = new MockFaultContract();
            FaultContractWrapperException instance      = new FaultContractWrapperException(faultContract);

            Assert.IsNotNull(instance);
            Assert.AreEqual(faultContract, instance.FaultContract);
        }
        public void CanCreateInstanceWithFaultContractAndGuid()
        {
            MockFaultContract faultContract = new MockFaultContract();
            Guid guid = Guid.NewGuid();
            FaultContractWrapperException instance = new FaultContractWrapperException(faultContract, guid);

            Assert.AreEqual(faultContract, instance.FaultContract);
            Assert.IsTrue(instance.Message.Contains(guid.ToString()));
        }
示例#6
0
        public void ShouldGetReplacedExceptionMessageWithGuid()
        {
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), "NewValue: {handlingInstanceID}", null);
            Exception exception = new Exception("MyException");
            Guid      guid      = Guid.NewGuid();
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(exception, guid);

            Assert.IsTrue(result.Message.Contains(guid.ToString()));
        }
        public void CanCreateInstanceWithFaultContractAndGuid()
        {
            MockFaultContract faultContract = new MockFaultContract();
            Guid guid = Guid.NewGuid();
            FaultContractWrapperException instance = new FaultContractWrapperException(faultContract, guid);

            Assert.AreEqual(faultContract, instance.FaultContract);
            Assert.IsTrue(instance.Message.Contains(guid.ToString()));
        }
示例#8
0
        public void CannotInjectInvalidPropertyNameIntoFaultContract()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Message", "{Invalid}");
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            Exception exception = new Exception("MyException");
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            Assert.IsTrue(string.IsNullOrEmpty(((MockFaultContract)result.FaultContract).Message));
        }
示例#9
0
        public void CanInjectGuidAttributesIntoFaultContract()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Id", "{Guid}");
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            Guid id = Guid.NewGuid();
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(new Exception(), id);

            Assert.AreEqual(id, ((MockFaultContract)result.FaultContract).Id);
        }
示例#10
0
        public void CanInjectInvalidPropertyValueIntoFaultContract()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Invalid", "{Message}");
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            Exception exception = new Exception("MyException");
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            Assert.AreEqual(exception.Message, ((MockFaultContract)result.FaultContract).Message);
        }
        public void CanCreateInstanceWithFaultContractAndGuidAndNullMessage()
        {
            MockFaultContract faultContract = new MockFaultContract();
            Guid      guid           = Guid.NewGuid();
            Exception innerException = new Exception();
            FaultContractWrapperException instance = new FaultContractWrapperException(faultContract, guid, null);

            Assert.AreEqual(faultContract, instance.FaultContract);
            Assert.IsFalse(string.IsNullOrEmpty(instance.Message));
            Assert.IsTrue(instance.Message.Contains(guid.ToString()));
        }
        public void CanCreateInstanceWithFaultContractAndGuidAndNullMessage()
        {
            MockFaultContract faultContract = new MockFaultContract();
            Guid guid = Guid.NewGuid();
            Exception innerException = new Exception();
            FaultContractWrapperException instance = new FaultContractWrapperException(faultContract, guid, null);

            Assert.AreEqual(faultContract, instance.FaultContract);
            Assert.IsFalse(string.IsNullOrEmpty(instance.Message));
            Assert.IsTrue(instance.Message.Contains(guid.ToString()));
        }
        public void CanAssignFaultContractMessage()
        {
            MockFaultContract             mock     = new MockFaultContract("message");
            FaultContractWrapperException instance = new FaultContractWrapperException(mock);

            Assert.AreSame(mock, instance.FaultContract);
            MockFaultContract newMock = new MockFaultContract();

            instance.FaultContract = newMock;
            Assert.AreSame(newMock, instance.FaultContract);
        }
示例#14
0
        public void CanInjectInvalidPropertyValueIntoCustomPropertyFaultContract()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Invalid", "{OffendingNumber}");
            FaultContractExceptionHandler instance  = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            NotFiniteNumberException      exception = new NotFiniteNumberException("MyException", 1231254);
            FaultContractWrapperException result    = (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            Assert.AreEqual((double)0, ((MockFaultContract)result.FaultContract).SomeNumber);
        }
示例#15
0
        public void CanPreventFieldMapping()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Message", "");
            FaultContractExceptionHandler instance = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            Exception exception = new Exception("Should not copy this message");
            FaultContractWrapperException result =
                (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            Assert.IsNull(((MockFaultContract)result.FaultContract).Message);
        }
        public void CanAssignFaultContractMessage()
        {
            MockFaultContract mock = new MockFaultContract("message");
            FaultContractWrapperException instance = new FaultContractWrapperException(mock);

            Assert.AreSame(mock, instance.FaultContract);

            MockFaultContract newMock = new MockFaultContract();
            instance.FaultContract = newMock;

            Assert.AreSame(newMock, instance.FaultContract);
        }
        void HandleFaultWrapper(
            FaultContractWrapperException faultContractWrapper,
            ref Message fault)
        {
            if (faultContractWrapper == null)
            {
                throw new ArgumentNullException(nameof(faultContractWrapper));
            }
            if (fault == null)
            {
                throw new ArgumentNullException(nameof(fault));
            }

            try
            {
                var action = _wcfContext.GetFaultedAction(faultContractWrapper.FaultContract.GetType()) ?? fault.Headers.Action;

                if (!_wcfContext.HasWebOperationContext)
                {
                    // in a SOAP only context, just build a new fault message out of the wrapped fault data and return
                    fault = Message.CreateMessage(
                        fault.Version,
                        ((FaultException)Activator.CreateInstance(
                             typeof(FaultException <>)
                             .MakeGenericType(faultContractWrapper.FaultContract.GetType()),
                             faultContractWrapper.FaultContract,
                             faultContractWrapper.Message))
                        .CreateMessageFault(),
                        action);
                }
                else
                {
                    var faultDetails = faultContractWrapper.FaultContract as Fault;

                    // we need to build a JSON or XML message out of the wrapped fault and put it in the web response:
                    BuildHttpResponseMessage(
                        faultDetails,
                        action,
                        faultDetails?.HttpStatusCode ?? HttpStatusCode.InternalServerError,
                        ref fault);
                }
            }
            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
                var handlingInstanceId = LogServerException(unhandledException);

                HandleFault(unhandledException, ref fault, handlingInstanceId, null);
            }
        }
示例#18
0
        public void CanInjectAttributesIntoFaultContract()
        {
            NameValueCollection attributes = new NameValueCollection();

            attributes.Add("Message", "{Message}");
            attributes.Add("Data", "{Data}");
            attributes.Add("SomeNumber", "{OffendingNumber}");

            FaultContractExceptionHandler instance  = new FaultContractExceptionHandler(typeof(MockFaultContract), attributes);
            NotFiniteNumberException      exception = new NotFiniteNumberException("MyException", 12341234123412);

            exception.Data.Add("someKey", "someValue");
            FaultContractWrapperException result = (FaultContractWrapperException)instance.HandleException(exception, Guid.NewGuid());

            MockFaultContract fault = (MockFaultContract)result.FaultContract;

            Assert.AreEqual(exception.Message, fault.Message);
            Assert.AreEqual(exception.Data.Count, fault.Data.Count);
            Assert.AreEqual(exception.Data["someKey"], fault.Data["someKey"]);
            Assert.AreEqual(exception.OffendingNumber, fault.SomeNumber);
        }
 public void ThrowOnNullFaultContract()
 {
     FaultContractWrapperException instance = new FaultContractWrapperException(null);
 }
 public void ThrowOnNullFaultContract()
 {
     FaultContractWrapperException instance = new FaultContractWrapperException(null);
 }