diff --git a/src/AspNet/OData/test/Asp.Versioning.WebApi.OData.Tests/Controllers/VersionedMetadataControllerTest.cs b/src/AspNet/OData/test/Asp.Versioning.WebApi.OData.Tests/Controllers/VersionedMetadataControllerTest.cs index 60292852..c39e10b4 100644 --- a/src/AspNet/OData/test/Asp.Versioning.WebApi.OData.Tests/Controllers/VersionedMetadataControllerTest.cs +++ b/src/AspNet/OData/test/Asp.Versioning.WebApi.OData.Tests/Controllers/VersionedMetadataControllerTest.cs @@ -37,6 +37,7 @@ public async Task options_should_return_expected_headers() configuration.AddApiVersioning( options => { + options.ReportApiVersions = true; options.Policies.Sunset( "VersionedMetadata" ) .Link( "policies" ) .Title( "Versioning Policy" ) diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi.ApiExplorer/ApiExplorer/VersionedApiExplorer.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi.ApiExplorer/ApiExplorer/VersionedApiExplorer.cs index 36b1de41..c7585844 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi.ApiExplorer/ApiExplorer/VersionedApiExplorer.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi.ApiExplorer/ApiExplorer/VersionedApiExplorer.cs @@ -101,7 +101,7 @@ public IDocumentationProvider DocumentationProvider /// The configured sunset policy manager. protected ISunsetPolicyManager SunsetPolicyManager { - get => sunsetPolicyManager ??= Configuration.DependencyResolver.GetSunsetPolicyManager(); + get => sunsetPolicyManager ??= Configuration.GetSunsetPolicyManager(); set => sunsetPolicyManager = value; } @@ -227,7 +227,7 @@ protected virtual ApiDescriptionGroupCollection InitializeApiDescriptions() } var routes = FlattenRoutes( Configuration.Routes ).ToArray(); - var policyManager = Configuration.DependencyResolver.GetSunsetPolicyManager(); + var policyManager = Configuration.GetSunsetPolicyManager(); foreach ( var apiVersion in FlattenApiVersions( controllerMappings ) ) { diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ApiVersionRequestProperties.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ApiVersionRequestProperties.cs index 284c66ba..0383fb9c 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ApiVersionRequestProperties.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ApiVersionRequestProperties.cs @@ -88,7 +88,7 @@ public ApiVersion? RequestedApiVersion return apiVersion; } - var parser = request.GetConfiguration().DependencyResolver.GetApiVersionParser(); + var parser = request.GetConfiguration().GetApiVersionParser(); try { diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DefaultApiVersionReporter.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DefaultApiVersionReporter.cs index dc05e257..caa7f0be 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DefaultApiVersionReporter.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DefaultApiVersionReporter.cs @@ -10,11 +10,6 @@ namespace Asp.Versioning; /// public partial class DefaultApiVersionReporter { - private static DefaultApiVersionReporter? instance; - - internal static IReportApiVersions GetOrCreate( ISunsetPolicyManager sunsetPolicyManager ) => - instance ??= new( sunsetPolicyManager ); - private static void AddApiVersionHeader( HttpResponseHeaders headers, string headerName, IReadOnlyList versions ) { if ( versions.Count == 0 || headers.Contains( headerName ) ) diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dependencies/DefaultContainer.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dependencies/DefaultContainer.cs new file mode 100644 index 00000000..7725393c --- /dev/null +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dependencies/DefaultContainer.cs @@ -0,0 +1,84 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. + +namespace Asp.Versioning.Dependencies; + +using Asp.Versioning; +using Asp.Versioning.Conventions; +using System.ComponentModel.Design; +using System.Web.Http.Dependencies; + +internal sealed class DefaultContainer : IDependencyResolver, IDependencyScope +{ + private readonly ServiceContainer container = new(); + private bool disposed; + + internal DefaultContainer() + { + container.AddService( typeof( ApiVersioningOptions ), static ( sc, t ) => new ApiVersioningOptions() ); + container.AddService( typeof( IApiVersionParser ), static ( sc, t ) => ApiVersionParser.Default ); + container.AddService( typeof( IControllerNameConvention ), static ( sc, t ) => ControllerNameConvention.Default ); + container.AddService( typeof( IProblemDetailsFactory ), static ( sc, t ) => new ProblemDetailsFactory() ); + container.AddService( typeof( ISunsetPolicyManager ), NewSunsetPolicyManager ); + container.AddService( typeof( IReportApiVersions ), NewApiVersionReporter ); + } + + public ApiVersioningOptions ApiVersioningOptions + { + get => GetApiVersioningOptions( container ); + set + { + container.RemoveService( typeof( ApiVersioningOptions ) ); + container.AddService( typeof( ApiVersioningOptions ), value ); + } + } + + public void Replace( Type serviceType, ServiceCreatorCallback activator ) + { + container.RemoveService( serviceType ); + container.AddService( serviceType, activator ); + } + + public IDependencyScope BeginScope() => this; + + public void Dispose() + { + if ( disposed ) + { + return; + } + + disposed = true; + container.Dispose(); + } + + public object GetService( Type serviceType ) => container.GetService( serviceType ); + + public IEnumerable GetServices( Type serviceType ) + { + var service = container.GetService( serviceType ); + + if ( service is not null ) + { + yield return service; + } + } + + private static ApiVersioningOptions GetApiVersioningOptions( IServiceProvider serviceProvider ) => + (ApiVersioningOptions) serviceProvider.GetService( typeof( ApiVersioningOptions ) ); + + private static ISunsetPolicyManager NewSunsetPolicyManager( IServiceProvider serviceProvider, Type type ) => + new SunsetPolicyManager( GetApiVersioningOptions( serviceProvider ) ); + + private static IReportApiVersions NewApiVersionReporter( IServiceProvider serviceProvider, Type type ) + { + var options = GetApiVersioningOptions( serviceProvider ); + + if ( options.ReportApiVersions ) + { + var sunsetPolicyManager = (ISunsetPolicyManager) serviceProvider.GetService( typeof( ISunsetPolicyManager ) ); + return new DefaultApiVersionReporter( sunsetPolicyManager ); + } + + return new DoNotReportApiVersions(); + } +} \ No newline at end of file diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DependencyResolverExtensions.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DependencyResolverExtensions.cs index f8b86bcc..6cad7f56 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DependencyResolverExtensions.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DependencyResolverExtensions.cs @@ -3,24 +3,39 @@ namespace Asp.Versioning; using Asp.Versioning.Conventions; +using System.Globalization; +using System.Web.Http; using System.Web.Http.Dependencies; internal static class DependencyResolverExtensions { - internal static TService? GetService( this IDependencyResolver resolver ) => (TService) resolver.GetService( typeof( TService ) ); - - internal static IApiVersionParser GetApiVersionParser( this IDependencyResolver resolver ) => - resolver.GetService() ?? ApiVersionParser.Default; - - internal static IReportApiVersions GetApiVersionReporter( this IDependencyResolver resolver ) => - resolver.GetService() ?? DefaultApiVersionReporter.GetOrCreate( resolver.GetSunsetPolicyManager() ); - - internal static IControllerNameConvention GetControllerNameConvention( this IDependencyResolver resolver ) => - resolver.GetService() ?? ControllerNameConvention.Default; - - internal static IProblemDetailsFactory GetProblemDetailsFactory( this IDependencyResolver resolver ) => - resolver.GetService() ?? ProblemDetailsFactory.Default; - - internal static ISunsetPolicyManager GetSunsetPolicyManager( this IDependencyResolver resolver ) => - resolver.GetService() ?? SunsetPolicyManager.Default; + internal static TService? GetService( this IDependencyResolver resolver ) => + (TService) resolver.GetService( typeof( TService ) ); + + internal static TService GetRequiredService( this IDependencyResolver resolver ) + { + var service = resolver.GetService(); + var message = string.Format( CultureInfo.CurrentCulture, SR.NoServiceRegistered, typeof( TService ) ); + return service ?? throw new InvalidOperationException( message ); + } + + internal static IApiVersionParser GetApiVersionParser( this HttpConfiguration configuration ) => + configuration.DependencyResolver.GetService() ?? + configuration.ApiVersioningServices().GetRequiredService(); + + internal static IReportApiVersions GetApiVersionReporter( this HttpConfiguration configuration ) => + configuration.DependencyResolver.GetService() ?? + configuration.ApiVersioningServices().GetRequiredService(); + + internal static IControllerNameConvention GetControllerNameConvention( this HttpConfiguration configuration ) => + configuration.DependencyResolver.GetService() ?? + configuration.ApiVersioningServices().GetRequiredService(); + + internal static IProblemDetailsFactory GetProblemDetailsFactory( this HttpConfiguration configuration ) => + configuration.DependencyResolver.GetService() ?? + configuration.ApiVersioningServices().GetRequiredService(); + + internal static ISunsetPolicyManager GetSunsetPolicyManager( this HttpConfiguration configuration ) => + configuration.DependencyResolver.GetService() ?? + configuration.ApiVersioningServices().GetRequiredService(); } \ No newline at end of file diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/ApiVersionControllerSelector.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/ApiVersionControllerSelector.cs index d42bedfa..80a76858 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/ApiVersionControllerSelector.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/ApiVersionControllerSelector.cs @@ -221,7 +221,7 @@ private static void ApplyImplicitConventions( HttpControllerDescriptor controlle } var actions = mapping.SelectMany( g => g ); - var namingConvention = controller.Configuration.DependencyResolver.GetControllerNameConvention(); + var namingConvention = controller.Configuration.GetControllerNameConvention(); var name = namingConvention.GroupName( controller.ControllerName ); var metadata = new ApiVersionMetadata( implicitVersionModel, implicitVersionModel, name ); @@ -344,7 +344,7 @@ private static void ApplyCollatedModelsToActions( HttpConfiguration configuration, List> visitedActions ) { - var namingConvention = configuration.DependencyResolver.GetControllerNameConvention(); + var namingConvention = configuration.GetControllerNameConvention(); for ( var i = 0; i < visitedActions.Count; i++ ) { diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpControllerTypeCache.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpControllerTypeCache.cs index 473f9811..5c5d3abb 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpControllerTypeCache.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpControllerTypeCache.cs @@ -33,7 +33,7 @@ private Dictionary> InitializeCache() var services = configuration.Services; var assembliesResolver = services.GetAssembliesResolver(); var typeResolver = services.GetHttpControllerTypeResolver(); - var convention = configuration.DependencyResolver.GetControllerNameConvention(); + var convention = configuration.GetControllerNameConvention(); var comparer = StringComparer.OrdinalIgnoreCase; return typeResolver.GetControllerTypes( assembliesResolver ) diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpResponseExceptionFactory.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpResponseExceptionFactory.cs index 4afb0774..22fac02a 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpResponseExceptionFactory.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Dispatcher/HttpResponseExceptionFactory.cs @@ -36,7 +36,7 @@ internal HttpResponseExceptionFactory( HttpRequestMessage request, ApiVersionMod private ApiVersioningOptions Options => configuration.GetApiVersioningOptions(); - private IProblemDetailsFactory ProblemDetails => configuration.DependencyResolver.GetProblemDetailsFactory(); + private IProblemDetailsFactory ProblemDetails => configuration.GetProblemDetailsFactory(); private ITraceWriter TraceWriter => configuration.Services.GetTraceWriter() ?? NullTraceWriter.Instance; diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DoNotReportApiVersions.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DoNotReportApiVersions.cs index 722073e5..db2b979d 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DoNotReportApiVersions.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/DoNotReportApiVersions.cs @@ -6,12 +6,6 @@ namespace Asp.Versioning; internal sealed class DoNotReportApiVersions : IReportApiVersions { - private static DoNotReportApiVersions? instance; - - private DoNotReportApiVersions() { } - - internal static IReportApiVersions Instance => instance ??= new(); - public ApiVersionMapping Mapping => Explicit | Implicit; public void Report( HttpResponseMessage response, ApiVersionModel apiVersionModel ) { } diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ErrorObjectFactory.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ErrorObjectFactory.cs index dd8b3689..79bbe3cc 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ErrorObjectFactory.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ErrorObjectFactory.cs @@ -43,7 +43,7 @@ public ProblemDetails CreateProblemDetails( return ProblemDetailsFactory.AddUnsupportedExtensions( request, status, problem, ApplyMessage ); } - return ProblemDetailsFactory.Default.CreateProblemDetails( + return ProblemDetailsFactory.NewProblemDetails( request, statusCode, title, diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ProblemDetailsFactory.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ProblemDetailsFactory.cs index 30d28c9c..baaad563 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ProblemDetailsFactory.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ProblemDetailsFactory.cs @@ -10,15 +10,16 @@ namespace Asp.Versioning; internal sealed class ProblemDetailsFactory : IProblemDetailsFactory { - private static IProblemDetailsFactory? @default; - - public static IProblemDetailsFactory Default - { - get => @default ??= new ProblemDetailsFactory(); - set => @default = value; - } - public ProblemDetails CreateProblemDetails( + HttpRequestMessage request, + int? statusCode = null, + string? title = null, + string? type = null, + string? detail = null, + string? instance = null ) => + NewProblemDetails( request, statusCode, title, type, detail, instance ); + + internal static ProblemDetails NewProblemDetails( HttpRequestMessage request, int? statusCode = null, string? title = null, diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ReportApiVersionsAttribute.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ReportApiVersionsAttribute.cs index 8208fd7e..2e7cfd8a 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ReportApiVersionsAttribute.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/ReportApiVersionsAttribute.cs @@ -32,14 +32,7 @@ public override void OnActionExecuted( HttpActionExecutedContext actionExecutedC var context = actionExecutedContext.ActionContext; var action = context.ActionDescriptor; - var reporter = reportApiVersions; - - if ( reporter is null ) - { - var dependencyResolver = context.ControllerContext.Configuration.DependencyResolver; - reporter = dependencyResolver.GetApiVersionReporter(); - } - + var reporter = reportApiVersions ?? context.ControllerContext.Configuration.GetApiVersionReporter(); var model = action.GetApiVersionMetadata().Map( reporter.Mapping ); response.RequestMessage ??= actionExecutedContext.Request; diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Routing/ApiVersionRouteConstraint.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Routing/ApiVersionRouteConstraint.cs index 65a77769..9d78028c 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Routing/ApiVersionRouteConstraint.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/Routing/ApiVersionRouteConstraint.cs @@ -41,7 +41,7 @@ public bool Match( HttpRequestMessage request, IHttpRoute route, string paramete return !string.IsNullOrEmpty( value ); } - var parser = request.GetConfiguration().DependencyResolver.GetApiVersionParser(); + var parser = request.GetConfiguration().GetApiVersionParser(); var properties = request.ApiVersionProperties(); properties.RouteParameter = parameterName; diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.Designer.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.Designer.cs index 6bf7e427..9dcdbed1 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.Designer.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.Designer.cs @@ -177,6 +177,15 @@ internal static string NoControllerSelected { } } + /// + /// Looks up a localized string similar to No service for type '{0}' has been registered.. + /// + internal static string NoServiceRegistered { + get { + return ResourceManager.GetString("NoServiceRegistered", resourceCulture); + } + } + /// /// Looks up a localized string similar to No HTTP resource was found that matches the request URI '{0}'.. /// diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.resx b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.resx index a5b89e38..29ed1630 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.resx +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SR.resx @@ -161,6 +161,9 @@ A controller was not selected for request URI '{0}' and API version '{1}'. + + No service for type '{0}' has been registered. + No HTTP resource was found that matches the request URI '{0}'. diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SunsetPolicyManager.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SunsetPolicyManager.cs index b15d2160..78af0cdf 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SunsetPolicyManager.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/SunsetPolicyManager.cs @@ -8,17 +8,10 @@ namespace Asp.Versioning; public partial class SunsetPolicyManager { private readonly ApiVersioningOptions options; - private static ISunsetPolicyManager? @default; /// /// Initializes a new instance of the class. /// /// The associated API versioning options. public SunsetPolicyManager( ApiVersioningOptions options ) => this.options = options; - - internal static ISunsetPolicyManager Default - { - get => @default ?? new SunsetPolicyManager( new ApiVersioningOptions() ); - set => @default = value; - } } \ No newline at end of file diff --git a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/System.Web.Http/HttpConfigurationExtensions.cs b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/System.Web.Http/HttpConfigurationExtensions.cs index 8a225a96..94062c5b 100644 --- a/src/AspNet/WebApi/src/Asp.Versioning.WebApi/System.Web.Http/HttpConfigurationExtensions.cs +++ b/src/AspNet/WebApi/src/Asp.Versioning.WebApi/System.Web.Http/HttpConfigurationExtensions.cs @@ -4,6 +4,7 @@ namespace System.Web.Http; using Asp.Versioning; using Asp.Versioning.Controllers; +using Asp.Versioning.Dependencies; using Asp.Versioning.Dispatcher; using Asp.Versioning.Formatting; using System.Globalization; @@ -16,7 +17,7 @@ namespace System.Web.Http; /// public static class HttpConfigurationExtensions { - private const string ApiVersioningOptionsKey = "MS_ApiVersioningOptions"; + private const string ApiVersioningServicesKey = "MS_ApiVersioningServices"; /// /// Gets the current API versioning options. @@ -30,7 +31,7 @@ public static ApiVersioningOptions GetApiVersioningOptions( this HttpConfigurati throw new ArgumentNullException( nameof( configuration ) ); } - return (ApiVersioningOptions) configuration.Properties.GetOrAdd( ApiVersioningOptionsKey, key => new ApiVersioningOptions() ); + return configuration.ApiVersioningServices().ApiVersioningOptions; } /// @@ -113,11 +114,9 @@ private static void AddApiVersioning( this HttpConfiguration configuration, ApiV } } - configuration.Properties.AddOrUpdate( ApiVersioningOptionsKey, options, ( key, oldValue ) => options ); + configuration.ApiVersioningServices().ApiVersioningOptions = options; configuration.ParameterBindingRules.Add( typeof( ApiVersion ), ApiVersionParameterBinding.Create ); configuration.Formatters.Insert( 0, new ProblemDetailsMediaTypeFormatter( configuration.Formatters.JsonFormatter ?? new() ) ); - - SunsetPolicyManager.Default = new SunsetPolicyManager( options ); } // ApiVersion.Neutral does not have the same meaning as IApiVersionNeutral. setting @@ -146,7 +145,9 @@ private static void ValidateApiVersioningOptions( ApiVersioningOptions options ) private static void EnableErrorObjectResponses( HttpConfiguration configuration ) { - ProblemDetailsFactory.Default = new ErrorObjectFactory(); + configuration.ApiVersioningServices().Replace( + typeof( IProblemDetailsFactory ), + static ( sc, t ) => new ErrorObjectFactory() ); var formatters = configuration.Formatters; var problemDetails = ProblemDetailsMediaTypeFormatter.DefaultMediaType; @@ -166,15 +167,6 @@ private static void EnableErrorObjectResponses( HttpConfiguration configuration } } - internal static IReportApiVersions GetApiVersionReporter( this HttpConfiguration configuration ) - { - var options = configuration.GetApiVersioningOptions(); - - if ( options.ReportApiVersions ) - { - return configuration.DependencyResolver.GetApiVersionReporter(); - } - - return DoNotReportApiVersions.Instance; - } + internal static DefaultContainer ApiVersioningServices( this HttpConfiguration configuration ) => + (DefaultContainer) configuration.Properties.GetOrAdd( ApiVersioningServicesKey, key => new DefaultContainer() ); } \ No newline at end of file diff --git a/src/AspNet/WebApi/test/Asp.Versioning.WebApi.Tests/ReportApiVersionsAttributeTest.cs b/src/AspNet/WebApi/test/Asp.Versioning.WebApi.Tests/ReportApiVersionsAttributeTest.cs index 57090ed2..45ec83cc 100644 --- a/src/AspNet/WebApi/test/Asp.Versioning.WebApi.Tests/ReportApiVersionsAttributeTest.cs +++ b/src/AspNet/WebApi/test/Asp.Versioning.WebApi.Tests/ReportApiVersionsAttributeTest.cs @@ -29,11 +29,12 @@ public void on_action_executed_should_add_version_headers() var method = controller.GetType().GetMethod( nameof( TestController.Get ) ); var controllerDescriptor = new Mock( configuration, "Test", controller.GetType() ) { CallBase = true }; var routeData = new HttpRouteData( new HttpRoute( "api/tests" ) ); - var controllerContext = new HttpControllerContext( new HttpConfiguration(), routeData, new HttpRequestMessage() ) { Controller = controller }; + var controllerContext = new HttpControllerContext( configuration, routeData, new HttpRequestMessage() ) { Controller = controller }; var actionDescriptor = new ReflectedHttpActionDescriptor( controllerDescriptor.Object, method ); var actionContext = new HttpActionContext( controllerContext, actionDescriptor ) { Response = new HttpResponseMessage() }; var context = new HttpActionExecutedContext( actionContext, null ); + configuration.AddApiVersioning( options => options.ReportApiVersions = true ); controllerContext.Request.SetConfiguration( new() ); controllerContext.Request.Properties["MS_HttpActionDescriptor"] = actionDescriptor; controllerDescriptor.Setup( cd => cd.GetCustomAttributes( It.IsAny() ) ).Returns( attributes ); @@ -69,11 +70,12 @@ public void on_action_executing_should_not_add_headers_for_versionX2Dneutral_con var method = controller.GetType().GetMethod( nameof( TestVersionNeutralController.Get ) ); var controllerDescriptor = new Mock( configuration, "Test", controller.GetType() ) { CallBase = true }; var routeData = new HttpRouteData( new HttpRoute( "api/tests" ) ); - var controllerContext = new HttpControllerContext( new HttpConfiguration(), routeData, new HttpRequestMessage() ) { Controller = new TestVersionNeutralController() }; + var controllerContext = new HttpControllerContext( configuration, routeData, new HttpRequestMessage() ) { Controller = new TestVersionNeutralController() }; var actionDescriptor = new ReflectedHttpActionDescriptor( controllerDescriptor.Object, method ); var actionContext = new HttpActionContext( controllerContext, actionDescriptor ) { Response = new HttpResponseMessage() }; var context = new HttpActionExecutedContext( actionContext, null ); + configuration.AddApiVersioning(); controllerDescriptor.Setup( cd => cd.GetCustomAttributes( It.IsAny() ) ).Returns( attributes ); controllerDescriptor.Object.Properties[typeof( ApiVersionModel )] = ApiVersionModel.Neutral; actionDescriptor.Properties[typeof( ApiVersionMetadata )] = ApiVersionMetadata.Neutral;