Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Commit

Permalink
Added ValueProviderFactories to ResourceFilterExecutingContext
Browse files Browse the repository at this point in the history
This enables removing value provider factories from model binding(which is needed in some scenarios like large file uploads)
  • Loading branch information
kichalla committed May 20, 2016
1 parent df4eb28 commit 20a2e74
Show file tree
Hide file tree
Showing 10 changed files with 292 additions and 88 deletions.
4 changes: 4 additions & 0 deletions samples/MvcSandbox/project.json
Expand Up @@ -31,6 +31,10 @@
"imports": [
"portable-net45+wp80+win8+wpa81+dnxcore50"
]
},
"Microsoft.DotNet.Watcher.Tools": {
"version": "1.0.0-*",
"imports": "portable-net451+win8"
}
},
"frameworks": {
Expand Down
@@ -1,7 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Microsoft.AspNetCore.Mvc.Filters
{
Expand All @@ -16,9 +18,19 @@ public class ResourceExecutingContext : FilterContext
/// </summary>
/// <param name="actionContext">The <see cref="ActionContext"/>.</param>
/// <param name="filters">The list of <see cref="IFilterMetadata"/> instances.</param>
public ResourceExecutingContext(ActionContext actionContext, IList<IFilterMetadata> filters)
/// <param name="valueProviderFactories">The list of <see cref="IValueProviderFactory"/> instances.</param>
public ResourceExecutingContext(
ActionContext actionContext,
IList<IFilterMetadata> filters,
IList<IValueProviderFactory> valueProviderFactories)
: base(actionContext, filters)
{
if (valueProviderFactories == null)
{
throw new ArgumentNullException(nameof(valueProviderFactories));
}

ValueProviderFactories = valueProviderFactories;
}

/// <summary>
Expand All @@ -29,5 +41,10 @@ public ResourceExecutingContext(ActionContext actionContext, IList<IFilterMetada
/// short-circuit execution of additional resource filters and the action itself.
/// </remarks>
public virtual IActionResult Result { get; set; }

/// <summary>
/// Gets the list of <see cref="IValueProviderFactory"/> instances used by model binding.
/// </summary>
public IList<IValueProviderFactory> ValueProviderFactories { get; }
}
}
Expand Up @@ -92,7 +92,7 @@ public class ControllerActionInvoker : IActionInvoker
{
throw new ArgumentNullException(nameof(valueProviderFactories));
}

_controllerFactory = controllerFactory;
_controllerArgumentBinder = controllerArgumentBinder;
_logger = logger;
Expand Down Expand Up @@ -216,7 +216,11 @@ private Task InvokeAllResourceFiltersAsync()
{
_cursor.Reset();

_resourceExecutingContext = new ResourceExecutingContext(_controllerContext, _filters);
_resourceExecutingContext = new ResourceExecutingContext(
_controllerContext,
_filters,
_controllerContext.ValueProviderFactories);

return InvokeResourceFilterAsync();
}

Expand Down Expand Up @@ -266,7 +270,7 @@ private async Task InvokeResourceFilterAsync()
}

_diagnosticSource.AfterOnResourceExecution(_resourceExecutedContext, item.FilterAsync);

if (_resourceExecutingContext.Result != null)
{
_logger.ResourceFilterShortCircuited(item.FilterAsync);
Expand Down
16 changes: 13 additions & 3 deletions test/Microsoft.AspNetCore.Mvc.Core.Test/ConsumesAttributeTests.cs
Expand Up @@ -10,6 +10,7 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Routing;
using Microsoft.Net.Http.Headers;
using Moq;
Expand Down Expand Up @@ -309,7 +310,10 @@ public void OnResourceExecuting_ForNoContentTypeMatch_SetsUnsupportedMediaTypeRe
};
var actionContext = new ActionContext(httpContext, new RouteData(), actionWithConstraint);

var resourceExecutingContext = new ResourceExecutingContext(actionContext, new[] { consumesFilter });
var resourceExecutingContext = new ResourceExecutingContext(
actionContext,
new[] { consumesFilter },
new List<IValueProviderFactory>());

// Act
consumesFilter.OnResourceExecuting(resourceExecutingContext);
Expand All @@ -336,7 +340,10 @@ public void OnResourceExecuting_NullOrEmptyRequestContentType_IsNoOp(string cont
};
var actionContext = new ActionContext(httpContext, new RouteData(), actionWithConstraint);

var resourceExecutingContext = new ResourceExecutingContext(actionContext, new[] { consumesFilter });
var resourceExecutingContext = new ResourceExecutingContext(
actionContext,
new[] { consumesFilter },
new List<IValueProviderFactory>());

// Act
consumesFilter.OnResourceExecuting(resourceExecutingContext);
Expand All @@ -361,7 +368,10 @@ public void OnResourceExecuting_ForAContentTypeMatch_IsNoOp(string contentType)
new List<FilterDescriptor>() { new FilterDescriptor(consumesFilter, FilterScope.Action) }
};
var actionContext = new ActionContext(httpContext, new RouteData(), actionWithConstraint);
var resourceExecutingContext = new ResourceExecutingContext(actionContext, new[] { consumesFilter });
var resourceExecutingContext = new ResourceExecutingContext(
actionContext,
new[] { consumesFilter },
new List<IValueProviderFactory>());

// Act
consumesFilter.OnResourceExecuting(resourceExecutingContext);
Expand Down
Expand Up @@ -2,9 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Buffers;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.TestCommon;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
Expand Down Expand Up @@ -87,7 +89,8 @@ public void FormatFilter_ContextContainsFormat_InRouteAndQueryData()

var resourceExecutingContext = new ResourceExecutingContext(
ac,
new IFilterMetadata[] { });
new IFilterMetadata[] { },
new List<IValueProviderFactory>());

var filter = new FormatFilter(mockObjects.OptionsManager);

Expand Down Expand Up @@ -322,7 +325,8 @@ public void FormatFilter_ExplicitContentType_SetOnObjectResult_TakesPrecedence()

var resourceExecutingContext = new ResourceExecutingContext(
actionContext,
new IFilterMetadata[] { });
new IFilterMetadata[] { },
new List<IValueProviderFactory>());

var filter = new FormatFilter(mockObjects.OptionsManager);

Expand Down Expand Up @@ -356,7 +360,8 @@ public void FormatFilter_ExplicitContentType_SetOnResponse_TakesPrecedence()

var resourceExecutingContext = new ResourceExecutingContext(
actionContext,
new IFilterMetadata[] { });
new IFilterMetadata[] { },
new List<IValueProviderFactory>());

var filter = new FormatFilter(mockObjects.OptionsManager);

Expand Down Expand Up @@ -392,7 +397,8 @@ public ResourceExecutingContext CreateResourceExecutingContext(IFilterMetadata[]
{
var context = new ResourceExecutingContext(
MockActionContext,
filters);
filters,
new List<IValueProviderFactory>());
return context;
}

Expand Down

0 comments on commit 20a2e74

Please sign in to comment.