rebus-org / Rebus.ServiceProvider

:bus: Microsoft Extensions Dependency Injection container adapter for Rebus
https://mookid.dk/category/rebus
Other
67 stars 34 forks source link

Rebus not working after upgrading from asp.net core 3.1 to asp.net 6.0 #75

Closed Morshed0308 closed 2 years ago

Morshed0308 commented 2 years ago

Getting this error message after trying to run the project Could not get current message context! The message context can only be resolved when handling a Rebus message, and it looks like this attempt was made from somewhere else. from the "Rebus.Pipeline.IMessageContext" rebus.serviceprovider

can anyone help me with this ? Thanks in Advance . Let me know if you need more details. @mookid8000

mookid8000 commented 2 years ago

Hi @Morshed0308 , could you post the full exception details?

Morshed0308 commented 2 years ago

this is the full details of the stack trace. @mookid8000

  at Rebus.Config.ServiceCollectionExtensions.<>c.<AddRebus>b__1_11(IServiceProvider _)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__4`1.<AddHttpMessageHandler>b__4_1(HttpMessageHandlerBuilder b)
   at Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass17_0.<CreateHandlerEntry>g__Configure|0(HttpMessageHandlerBuilder b)
   at Microsoft.Extensions.Http.LoggingHttpMessageHandlerBuilderFilter.<>c__DisplayClass3_0.<Configure>b__0(HttpMessageHandlerBuilder builder)
   at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateHandlerEntry(String name)
   at Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass14_0.<.ctor>b__1()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateHandler(String name)
   at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateClient(String name)
   at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddTransientHelper[TClient,TImplementation](IServiceProvider s, IHttpClientBuilder builder)
   at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__DisplayClass13_0`2.<AddTypedClientCore>b__0(IServiceProvider s)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
   at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>d__12.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at RS.Booking.Service.Program.Main(String[] args) in C:\Data\Live.Tour\RS SjB8liv-backend\Services\Booking\RS.Booking.Service\Program.cs:line 13
mookid8000 commented 2 years ago

That's the stack trace 🙂 it doesn't show the exception and its inner exceptions though, could you maybe include those?

Morshed0308 commented 2 years ago

The inner exception is null , and I have already added the full exception message in the top . image

mookid8000 commented 2 years ago

Ok!

It looks like something tried to resolve IMessageContext from the service provider during startup, which happened as a consequence of it being hooked up with HttpClient somehow.

Does this give you a hint at what's happening?

Did you, by any chance, try to hook up your HttpClient with Rebus by resolving IMessageContext in an attempt to get correlation IDs or something like that?

Morshed0308 commented 2 years ago

I tried to get the ClaimsPrinciple from the messagecontext using the transaction context . Tried to inject the IMessageContext using the constructor injection. when I turn the constructor injection off , the project runs but the event dependent on the service bus fails since it cannot authenticate the user. I am adding the code snippet here image

If I turn of the first return , and the IMessageContext , the project runs fine but the service bus cannot authenticate .

mookid8000 commented 2 years ago

You can't use constructor injection to do that, because – as you are now experiencing first hand 🙂 – Rebus' message context is not always available: It can be resolved ONLY from within a Rebus message handler (or some place in the incoming message pipeline).

If you want to write code that picks stuff out of Rebus' message context when it is available, you can access it via the static accessor here:

var context = MessageContext.Current;

if (context != null)
{
    // have fun with IMessageContext in here
}

If you change your code to get IMessageContext via var context = MessageContext.Current in GetCurrentPrincipal(), then it should work 🙂

Morshed0308 commented 2 years ago

But it works in dotnet core 3.1 , is there any reason it does not work in dotnet 6.0?

mookid8000 commented 2 years ago

I have no idea why it worked in dotnet core 3.1.

And yes, it should not work in dotnet 6 - it should not work anywhere, actually 🙂

The thing is this: If the service provider is asked to resolve IMessageContext outside of a Rebus message handler (i.e. in a place where there IS no Rebus message context), you should get an error.

If it worked before, it's most likely because you were "lucky" and HttpClient (which I bet is registered as a singleton in the container) happened to be resolved the 1st time as part of handling a Rebus message, which will have caused the injected IMessageContext to have been "caught" (because of a container lifetime scope mismatch), which in turn will have caused the same message context to have been used throughout the entire lifetime of the application.

You can solve your problem by NOT injecting IMessageContext and then just access it via its static accessor as mentioned - e.g. like

return GetClaimsPrincipalFromHttpContext() 
        ?? GetClaimsPrincipalFromRebusMessageContext() 
        ?? GetClaimsPrincipalFromThread();

where GetClaimsPrincipalFromRebusMessageContext() is something like


public ClaimsPrincipal GetClaimsPrincipalFromRebusMessageContext() =>
    MessageContext.Current?.TransactionContext.Items["CurrentPrincipal"] as ClaimsPrincipal;