Search code examples
.netrabbitmqjson.netmasstransit

dotnet+MassTransit+RMQ issue while ussing IRequestClient<T> and NewtonsoftJson


ASP.NET core API 6.0 + MassTransit 8.0.16 + Masstransit.Newtonsoft 8.0.16

I tried to implement request <-> response pattern and add newtonsoft serializer but faced with error after completing request. Not - Request and Response are successful and everything work fine. But finishing request there is an error in logs:

System.ArgumentNullException: Value cannot be null. (Parameter 'source')
   at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
   at MassTransit.RequestFaultException..ctor(String requestType, Fault fault) in /_/src/MassTransit.Abstractions/Exceptions/RequestFaultException.cs:line 13
   at MassTransit.Clients.ClientRequestHandle`1.Fail(Fault message) in /_/src/MassTransit/Clients/ClientRequestHandle.cs:line 221
   at MassTransit.Clients.ClientRequestHandle`1.FaultHandler(ConsumeContext`1 context) in /_/src/MassTransit/Clients/ClientRequestHandle.cs:line 214
   at MassTransit.Clients.ClientRequestHandle`1.<HandleFault>g__MessageHandler|34_0(ConsumeContext`1 context) in /_/src/MassTransit/Clients/ClientRequestHandle.cs:line 201
   at MassTransit.Middleware.HandlerMessageFilter`1.MassTransit.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next) in /_/src/MassTransit/Middleware/HandlerMessageFilter.cs:line 44
   at MassTransit.Middleware.HandlerMessageFilter`1.MassTransit.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next) in /_/src/MassTransit/Middleware/HandlerMessageFilter.cs:line 72
   at MassTransit.Middleware.KeyFilter`2.Send(TContext context, IPipe`1 next) in /_/src/MassTransit/Middleware/KeyFilter.cs:line 46
   at MassTransit.Middleware.TeeFilter`1.<>c__DisplayClass5_0.<<Send>g__SendAsync|1>d.MoveNext() in /_/src/MassTransit/Middleware/TeeFilter.cs:line 40
--- End of stack trace from previous location ---
   at MassTransit.Middleware.OutputPipeFilter`2.SendToOutput(IPipe`1 next, TOutput pipeContext) in /_/src/MassTransit/Middleware/OutputPipeFilter.cs:line 76
   at MassTransit.Middleware.OutputPipeFilter`2.SendToOutput(IPipe`1 next, TOutput pipeContext) in /_/src/MassTransit/Middleware/OutputPipeFilter.cs:line 108
   at MassTransit.Middleware.DynamicFilter`1.<>c__DisplayClass10_0.<<Send>g__SendAsync|0>d.MoveNext() in /_/src/MassTransit/Middleware/DynamicFilter.cs:line 89
--- End of stack trace from previous location ---
   at MassTransit.Middleware.DeserializeFilter.Send(ReceiveContext context, IPipe`1 next) in /_/src/MassTransit/Middleware/DeserializeFilter.cs:line 40
   at MassTransit.Middleware.RescueFilter`2.MassTransit.IFilter<TContext>.Send(TContext context, IPipe`1 next) in /_/src/MassTransit/Middleware/RescueFilter.cs:line 43

Repository which represent bug

If I remove:

cfg.ClearSerialization(); 
cfg.UseNewtonsoftRawJsonSerializer();

Everything works perfect but I need serializing for support another projects using rabbit mq and publish / consumer pattern.

I also tried:

cfg.ConfigureNewtonsoftJsonSerializer(s =>
{
    s.NullValueHandling = NullValueHandling.Ignore;
    return s;
});

Didn't help.


Solution

  • I got an answer on GitHub from the Author of MassTransit - Chris Patterson. Unfortunately, I can't use

    cfg.ClearSerialization(); 
    cfg.UseNewtonsoftRawJsonSerializer();
    

    only

    cfg.ClearSerialization(); 
    cfg.UseNewtonsoftRawJsonSerializer(RawSerializerOptions.AddTransportHeaders | RawSerializerOptions.CopyHeaders);
    

    with Request/Response Pattern

    Ever with publish/consumer pattern, it works perfectly and the benefits were - that contract should follow all self namespace.