diff --git a/src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs b/src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs index 53ace2f2e3..178010cc95 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ReflectedActionInvoker.cs @@ -37,12 +37,20 @@ namespace Microsoft.AspNet.Mvc } } - public override Task InvokeAsync() + public async override Task InvokeAsync() { - ActionContext.Controller = _controllerFactory.CreateController(ActionContext); - ActionContext.InputFormatters = _inputFormattersProvider.InputFormatters - .ToList(); - return base.InvokeAsync(); + var controller = _controllerFactory.CreateController(ActionContext); + try + { + ActionContext.Controller = controller; + ActionContext.InputFormatters = _inputFormattersProvider.InputFormatters + .ToList(); + await base.InvokeAsync(); + } + finally + { + _controllerFactory.ReleaseController(ActionContext.Controller); + } } protected override async Task InvokeActionAsync(ActionExecutingContext actionExecutingContext) diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs index 0ae5bb59a6..ed4a110710 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ReflectedActionInvokerTest.cs @@ -1272,12 +1272,12 @@ namespace Microsoft.AspNet.Mvc Assert.Same(input, contentResult.Value); } - private ReflectedActionInvoker CreateInvoker(IFilter filter, bool actionThrows = false) + private TestReflectedActionInvoker CreateInvoker(IFilter filter, bool actionThrows = false) { return CreateInvoker(new[] { filter }, actionThrows); } - private ReflectedActionInvoker CreateInvoker(IFilter[] filters, bool actionThrows = false) + private TestReflectedActionInvoker CreateInvoker(IFilter[] filters, bool actionThrows = false) { var actionDescriptor = new ReflectedActionDescriptor() { @@ -1319,6 +1319,7 @@ namespace Microsoft.AspNet.Mvc var controllerFactory = new Mock(); controllerFactory.Setup(c => c.CreateController(It.IsAny())).Returns(this); + controllerFactory.Setup(m => m.ReleaseController(this)).Verifiable(); var actionBindingContextProvider = new Mock(MockBehavior.Strict); actionBindingContextProvider @@ -1333,11 +1334,12 @@ namespace Microsoft.AspNet.Mvc var inputFormattersProvider = new Mock(); inputFormattersProvider.SetupGet(o => o.InputFormatters) .Returns(new List()); - var invoker = new ReflectedActionInvoker( + + var invoker = new TestReflectedActionInvoker( actionContext, actionBindingContextProvider.Object, filterProvider.Object, - controllerFactory.Object, + controllerFactory, actionDescriptor, inputFormattersProvider.Object); @@ -1613,5 +1615,34 @@ namespace Microsoft.AspNet.Mvc return Task.FromResult(0); } } + + public class TestReflectedActionInvoker : ReflectedActionInvoker + { + private Mock _factoryMock; + + public TestReflectedActionInvoker( + ActionContext actionContext, + IActionBindingContextProvider bindingContextProvider, + INestedProviderManager filterProvider, + Mock controllerFactoryMock, + ReflectedActionDescriptor descriptor, + IInputFormattersProvider inputFormattersProvider) : + base(actionContext, + bindingContextProvider, + filterProvider, + controllerFactoryMock.Object, + descriptor, + inputFormattersProvider) + { + _factoryMock = controllerFactoryMock; + } + + public async override Task InvokeAsync() + { + await base.InvokeAsync(); + + _factoryMock.Verify(); + } + } } }