From d77c3b8b8d417b612ca8b05135b4dfe6fe950f89 Mon Sep 17 00:00:00 2001 From: Jeow Li Huan Date: Fri, 24 May 2019 00:53:01 +0800 Subject: [PATCH 1/2] Change SkipStatusCodePagesAttribute to inherit from IAlwaysRunResultFilter instead of IResourceFilter (fixes #10317). --- ...pNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs | 6 +++--- .../src/SkipStatusCodePagesAttribute.cs | 9 ++++---- .../test/SkipStatusCodePagesAttributeTest.cs | 21 +++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs b/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs index ad98c18e9ace..3f469248d84a 100644 --- a/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs +++ b/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs @@ -130,11 +130,11 @@ public virtual void AddValidation(Microsoft.AspNetCore.Mvc.ModelBinding.Validati public override bool IsValid(object value) { throw null; } } [System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=false, Inherited=true)] - public partial class SkipStatusCodePagesAttribute : System.Attribute, Microsoft.AspNetCore.Mvc.Filters.IFilterMetadata, Microsoft.AspNetCore.Mvc.Filters.IResourceFilter + public partial class SkipStatusCodePagesAttribute : System.Attribute, Microsoft.AspNetCore.Mvc.Filters.IAlwaysRunResultFilter, Microsoft.AspNetCore.Mvc.Filters.IFilterMetadata, Microsoft.AspNetCore.Mvc.Filters.IResultFilter { public SkipStatusCodePagesAttribute() { } - public void OnResourceExecuted(Microsoft.AspNetCore.Mvc.Filters.ResourceExecutedContext context) { } - public void OnResourceExecuting(Microsoft.AspNetCore.Mvc.Filters.ResourceExecutingContext context) { } + public void OnResultExecuted(Microsoft.AspNetCore.Mvc.Filters.ResultExecutedContext context) { } + public void OnResultExecuting(Microsoft.AspNetCore.Mvc.Filters.ResultExecutingContext context) { } } [System.AttributeUsageAttribute(System.AttributeTargets.Property, Inherited=true, AllowMultiple=false)] public sealed partial class TempDataAttribute : System.Attribute diff --git a/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs b/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs index bfc644764f21..6945a982325a 100644 --- a/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs +++ b/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs @@ -11,15 +11,16 @@ namespace Microsoft.AspNetCore.Mvc /// A filter that prevents execution of the StatusCodePages middleware. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] - public class SkipStatusCodePagesAttribute : Attribute, IResourceFilter + public class SkipStatusCodePagesAttribute : Attribute, IAlwaysRunResultFilter { /// - public void OnResourceExecuted(ResourceExecutedContext context) + public void OnResultExecuted(ResultExecutedContext context) { + // Intentionally empty. } /// - public void OnResourceExecuting(ResourceExecutingContext context) + public void OnResultExecuting(ResultExecutingContext context) { if (context == null) { @@ -34,4 +35,4 @@ public void OnResourceExecuting(ResourceExecutingContext context) } } } -} \ No newline at end of file +} diff --git a/src/Mvc/Mvc.ViewFeatures/test/SkipStatusCodePagesAttributeTest.cs b/src/Mvc/Mvc.ViewFeatures/test/SkipStatusCodePagesAttributeTest.cs index ea0cc4952e99..a6b9f75e8b81 100644 --- a/src/Mvc/Mvc.ViewFeatures/test/SkipStatusCodePagesAttributeTest.cs +++ b/src/Mvc/Mvc.ViewFeatures/test/SkipStatusCodePagesAttributeTest.cs @@ -1,12 +1,10 @@ // 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.Collections.Generic; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Routing; using Xunit; @@ -19,12 +17,12 @@ public void SkipStatusCodePagesAttribute_TurnsOfStatusCodePages() { // Arrange var skipStatusCodeAttribute = new SkipStatusCodePagesAttribute(); - var resourceExecutingContext = CreateResourceExecutingContext(new IFilterMetadata[] { skipStatusCodeAttribute }); + var resultExecutingContext = CreateResultExecutingContext(new IFilterMetadata[] { skipStatusCodeAttribute }); var statusCodePagesFeature = new TestStatusCodeFeature(); - resourceExecutingContext.HttpContext.Features.Set(statusCodePagesFeature); + resultExecutingContext.HttpContext.Features.Set(statusCodePagesFeature); // Act - skipStatusCodeAttribute.OnResourceExecuting(resourceExecutingContext); + skipStatusCodeAttribute.OnResultExecuting(resultExecutingContext); // Assert Assert.False(statusCodePagesFeature.Enabled); @@ -35,18 +33,19 @@ public void SkipStatusCodePagesAttribute_Does_Not_Throw_If_Feature_Missing() { // Arrange var skipStatusCodeAttribute = new SkipStatusCodePagesAttribute(); - var resourceExecutingContext = CreateResourceExecutingContext(new IFilterMetadata[] { skipStatusCodeAttribute }); + var resultExecutingContext = CreateResultExecutingContext(new IFilterMetadata[] { skipStatusCodeAttribute }); // Act - skipStatusCodeAttribute.OnResourceExecuting(resourceExecutingContext); + skipStatusCodeAttribute.OnResultExecuting(resultExecutingContext); } - private static ResourceExecutingContext CreateResourceExecutingContext(IFilterMetadata[] filters) + private static ResultExecutingContext CreateResultExecutingContext(IFilterMetadata[] filters) { - return new ResourceExecutingContext( + return new ResultExecutingContext( CreateActionContext(), filters, - new List()); + null, + new object()); } private static ActionContext CreateActionContext() @@ -59,4 +58,4 @@ private class TestStatusCodeFeature : IStatusCodePagesFeature public bool Enabled { get; set; } = true; } } -} \ No newline at end of file +} From 6f08099ad346ba96c3a7924f4ef6108fd93e8cfe Mon Sep 17 00:00:00 2001 From: Jeow Li Huan Date: Sun, 2 Jun 2019 20:10:54 +0800 Subject: [PATCH 2/2] Add IOrderedFilter to SkipStatusCodePagesAttribute so that callers can ensure it executes first (#10317). --- ...icrosoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs | 3 ++- .../Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs b/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs index 3f469248d84a..c92124588812 100644 --- a/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs +++ b/src/Mvc/Mvc.ViewFeatures/ref/Microsoft.AspNetCore.Mvc.ViewFeatures.netcoreapp3.0.cs @@ -130,9 +130,10 @@ public virtual void AddValidation(Microsoft.AspNetCore.Mvc.ModelBinding.Validati public override bool IsValid(object value) { throw null; } } [System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=false, Inherited=true)] - public partial class SkipStatusCodePagesAttribute : System.Attribute, Microsoft.AspNetCore.Mvc.Filters.IAlwaysRunResultFilter, Microsoft.AspNetCore.Mvc.Filters.IFilterMetadata, Microsoft.AspNetCore.Mvc.Filters.IResultFilter + public partial class SkipStatusCodePagesAttribute : System.Attribute, Microsoft.AspNetCore.Mvc.Filters.IAlwaysRunResultFilter, Microsoft.AspNetCore.Mvc.Filters.IFilterMetadata, Microsoft.AspNetCore.Mvc.Filters.IOrderedFilter, Microsoft.AspNetCore.Mvc.Filters.IResultFilter { public SkipStatusCodePagesAttribute() { } + public int Order { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public void OnResultExecuted(Microsoft.AspNetCore.Mvc.Filters.ResultExecutedContext context) { } public void OnResultExecuting(Microsoft.AspNetCore.Mvc.Filters.ResultExecutingContext context) { } } diff --git a/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs b/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs index 6945a982325a..75bf6ea7896a 100644 --- a/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs +++ b/src/Mvc/Mvc.ViewFeatures/src/SkipStatusCodePagesAttribute.cs @@ -11,8 +11,15 @@ namespace Microsoft.AspNetCore.Mvc /// A filter that prevents execution of the StatusCodePages middleware. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] - public class SkipStatusCodePagesAttribute : Attribute, IAlwaysRunResultFilter + public class SkipStatusCodePagesAttribute : Attribute, IAlwaysRunResultFilter, IOrderedFilter { + /// + /// + /// Gets or sets the order value for determining the order of execution of filters. Filters execute in + /// ascending numeric value of the property. + /// + public int Order { get; set; } = -1000; + /// public void OnResultExecuted(ResultExecutedContext context) {