Skip to content

HttpRequestMessage is disposed after the filters are resolved #59

@lillo42

Description

@lillo42

Describe the Bug

HttpRequestMessage is disposed after the filters are resolved in some situation

Steps to Reproduce

My code: AutofacRequestMessageDisposed.zip

public class ReproTest
{
        [Fact]
        public async Task RegisterHttpRequestMessageNotDisposeAfterScopeAsync()
        {
            var config = new HttpConfiguration();
            var builder = new ContainerBuilder();

            config.RegisterHttpRequestMessage(builder);

            var container = builder.Build();
            Assert.True(container.IsRegistered<HttpRequestMessage>());

            var httpRequestMessage = new HttpRequestMessage
            {
                Content = new StringContent("")
            };

            HttpRequestMessageProvider.Current = httpRequestMessage;
            var result = HttpRequestMessageProvider.Current;


            using(var scope = container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag))
            {
                Assert.Same(result, scope.Resolve<HttpRequestMessage>());
            }

            _ = await result.Content.ReadAsStringAsync();
        }
}

Expected Behavior

Autofac.WebAPI not dispose it

Exception with Stack Trace

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Cannot access a disposed object. Object name: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'.
</ExceptionMessage>
<ExceptionType>System.ObjectDisposedException</ExceptionType>
<StackTrace>
at System.Net.Http.HttpContent.CheckDisposed() at System.Net.Http.HttpContent.ReadAsStringAsync() at AutofacRequestMessageDisposed.Filters.SomeDependency.<DoSomething>d__2.MoveNext() in C:\Users\RAD17\source\repos\AutofacRequestMessageDisposed\AutofacRequestMessageDisposed\Filters\CheckRequestFilter.cs:line 33 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at AutofacRequestMessageDisposed.Filters.CheckRequestFilter.<ExecuteAuthorizationFilterAsync>d__2.MoveNext() in C:\Users\RAD17\source\repos\AutofacRequestMessageDisposed\AutofacRequestMessageDisposed\Filters\CheckRequestFilter.cs:line 18 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()
</StackTrace>
</Error>

Dependency Versions

Autofac: 6.0.0/5.2.0
Autofac.WebAPI: 6.0.0/5.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions