diff --git a/src/MassTransit.Tests/PublishRequest_Specs.cs b/src/MassTransit.Tests/PublishRequest_Specs.cs index 7296ce3c32..0d73f55878 100644 --- a/src/MassTransit.Tests/PublishRequest_Specs.cs +++ b/src/MassTransit.Tests/PublishRequest_Specs.cs @@ -12,6 +12,7 @@ // specific language governing permissions and limitations under the License. namespace MassTransit.Tests { + using System; using Exceptions; using Magnum.Extensions; using Magnum.TestFramework; @@ -79,5 +80,43 @@ public void Should_throw_a_timeout_exception_if_no_response_received() pingReceived.IsAvailable(timeout).ShouldBeTrue("The ping was not received"); pongReceived.IsAvailable(timeout).ShouldBeFalse("The pong should not have been received"); } + + [Test] + public void Should_throw_a_handler_exception_on_the_calling_thread() + { + var pongReceived = new FutureMessage(); + var pingReceived = new FutureMessage(); + + RemoteBus.SubscribeHandler(message => + { + pingReceived.Set(message); + RemoteBus.MessageContext().Respond(new PongMessage(message.CorrelationId)); + }); + + var ping = new PingMessage(); + + var timeout = 8.Seconds(); + + var exception = Assert.Throws(() => + { + LocalBus.PublishRequest(ping, x => + { + x.Handle(message => + { + pongReceived.Set(message); + + throw new InvalidOperationException("I got it, but I am naughty with it."); + }); + + x.SetTimeout(timeout); + }); + }, "A request exception should have been thrown"); + + exception.ResponseMessage.ShouldBeAnInstanceOf(); + exception.HandlerException.ShouldBeAnInstanceOf(); + + pingReceived.IsAvailable(timeout).ShouldBeTrue("The ping was not received"); + pongReceived.IsAvailable(timeout).ShouldBeTrue("The pong was not received"); + } } } \ No newline at end of file diff --git a/src/MassTransit/Exceptions/RequestException.cs b/src/MassTransit/Exceptions/RequestException.cs index 834a2374e6..186c5b0e4d 100644 --- a/src/MassTransit/Exceptions/RequestException.cs +++ b/src/MassTransit/Exceptions/RequestException.cs @@ -15,7 +15,6 @@ namespace MassTransit.Exceptions using System; using System.Runtime.Serialization; - [Serializable] public class RequestException : MassTransitException diff --git a/src/MassTransit/RequestResponse/Configurators/RequestConfiguratorImpl.cs b/src/MassTransit/RequestResponse/Configurators/RequestConfiguratorImpl.cs index 4e53f12017..c29744725d 100644 --- a/src/MassTransit/RequestResponse/Configurators/RequestConfiguratorImpl.cs +++ b/src/MassTransit/RequestResponse/Configurators/RequestConfiguratorImpl.cs @@ -62,8 +62,8 @@ public void Handle(Action handler) } catch (Exception ex) { - var responseException = new RequestException(message, ex); - _request.Fail(responseException); + var exception = new RequestException(message, ex); + _request.Fail(exception); } };