diff --git a/src/Http/Http.Extensions/ref/Microsoft.AspNetCore.Http.Extensions.netcoreapp3.0.cs b/src/Http/Http.Extensions/ref/Microsoft.AspNetCore.Http.Extensions.netcoreapp3.0.cs index 77740aa3f055..4f7e2f564260 100644 --- a/src/Http/Http.Extensions/ref/Microsoft.AspNetCore.Http.Extensions.netcoreapp3.0.cs +++ b/src/Http/Http.Extensions/ref/Microsoft.AspNetCore.Http.Extensions.netcoreapp3.0.cs @@ -9,6 +9,10 @@ public static void AppendList(this Microsoft.AspNetCore.Http.IHeaderDictionar public static Microsoft.AspNetCore.Http.Headers.RequestHeaders GetTypedHeaders(this Microsoft.AspNetCore.Http.HttpRequest request) { throw null; } public static Microsoft.AspNetCore.Http.Headers.ResponseHeaders GetTypedHeaders(this Microsoft.AspNetCore.Http.HttpResponse response) { throw null; } } + public static partial class HttpContextServerVariableExtensions + { + public static string GetServerVariable(this Microsoft.AspNetCore.Http.HttpContext context, string variableName) { throw null; } + } public static partial class ResponseExtensions { public static void Clear(this Microsoft.AspNetCore.Http.HttpResponse response) { } diff --git a/src/Http/Http.Extensions/src/HttpContextServerVariableExtensions.cs b/src/Http/Http.Extensions/src/HttpContextServerVariableExtensions.cs new file mode 100644 index 000000000000..1b41d8e305fa --- /dev/null +++ b/src/Http/Http.Extensions/src/HttpContextServerVariableExtensions.cs @@ -0,0 +1,31 @@ +// 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 Microsoft.AspNetCore.Http.Features; + +namespace Microsoft.AspNetCore.Http +{ + public static class HttpContextServerVariableExtensions + { + /// + /// Gets the value of a server variable for the current request. + /// + /// The http context for the request. + /// The name of the variable. + /// + /// null if the server does not support the feature. + /// May return null or empty if the variable does not exist or is not set. + /// + public static string GetServerVariable(this HttpContext context, string variableName) + { + var feature = context.Features.Get(); + + if (feature == null) + { + return null; + } + + return feature[variableName]; + } + } +} diff --git a/src/Http/Http.Features/ref/Microsoft.AspNetCore.Http.Features.netstandard2.0.cs b/src/Http/Http.Features/ref/Microsoft.AspNetCore.Http.Features.netstandard2.0.cs index c97e11f219a7..30f567851c78 100644 --- a/src/Http/Http.Features/ref/Microsoft.AspNetCore.Http.Features.netstandard2.0.cs +++ b/src/Http/Http.Features/ref/Microsoft.AspNetCore.Http.Features.netstandard2.0.cs @@ -260,6 +260,10 @@ public partial interface IResponseCookiesFeature { Microsoft.AspNetCore.Http.IResponseCookies Cookies { get; } } + public partial interface IServerVariablesFeature + { + string this[string variableName] { get; set; } + } public partial interface IServiceProvidersFeature { System.IServiceProvider RequestServices { get; set; } diff --git a/src/Servers/IIS/IIS/src/IServerVariableFeature.cs b/src/Http/Http.Features/src/IServerVariablesFeature.cs similarity index 72% rename from src/Servers/IIS/IIS/src/IServerVariableFeature.cs rename to src/Http/Http.Features/src/IServerVariablesFeature.cs index 44f667cb4103..2ff18f77c5c6 100644 --- a/src/Servers/IIS/IIS/src/IServerVariableFeature.cs +++ b/src/Http/Http.Features/src/IServerVariablesFeature.cs @@ -5,13 +5,7 @@ namespace Microsoft.AspNetCore.Http.Features { /// /// This feature provides access to request server variables set. - /// - /// This feature is only available when hosting ASP.NET Core in-process with IIS or IIS Express. - /// /// - /// - /// For a list of common server variables available in IIS, see http://go.microsoft.com/fwlink/?LinkId=52471. - /// public interface IServerVariablesFeature { /// diff --git a/src/Middleware/Rewrite/ref/Microsoft.AspNetCore.Rewrite.csproj b/src/Middleware/Rewrite/ref/Microsoft.AspNetCore.Rewrite.csproj index 587668329e38..a4014b3f9491 100644 --- a/src/Middleware/Rewrite/ref/Microsoft.AspNetCore.Rewrite.csproj +++ b/src/Middleware/Rewrite/ref/Microsoft.AspNetCore.Rewrite.csproj @@ -7,7 +7,6 @@ - diff --git a/src/Middleware/Rewrite/src/Internal/PatternSegments/IISServerVariableSegment.cs b/src/Middleware/Rewrite/src/Internal/PatternSegments/IISServerVariableSegment.cs index 30504d54a4f1..8bc3f96cf8a8 100644 --- a/src/Middleware/Rewrite/src/Internal/PatternSegments/IISServerVariableSegment.cs +++ b/src/Middleware/Rewrite/src/Internal/PatternSegments/IISServerVariableSegment.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNetCore.Server.IIS; +using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Rewrite.Internal.PatternSegments { @@ -19,7 +19,7 @@ public IISServerVariableSegment(string variableName, Func fallba public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences) { - return context.HttpContext.GetIISServerVariable(_variableName) ?? _fallbackThunk().Evaluate(context, ruleBackReferences, conditionBackReferences); + return context.HttpContext.GetServerVariable(_variableName) ?? _fallbackThunk().Evaluate(context, ruleBackReferences, conditionBackReferences); } } } diff --git a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj index be6f19ceb739..b7f9f44efa67 100644 --- a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj +++ b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj @@ -1,4 +1,4 @@ - + ASP.NET Core basic middleware for rewriting URLs. Includes: @@ -15,7 +15,6 @@ - diff --git a/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.csproj b/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.csproj index ed6753b780b4..72d9c85999fa 100644 --- a/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.csproj +++ b/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.csproj @@ -8,6 +8,8 @@ + + diff --git a/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.netcoreapp3.0.cs b/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.netcoreapp3.0.cs index 7294851a439a..635097115dd5 100644 --- a/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.netcoreapp3.0.cs +++ b/src/Servers/IIS/IIS/ref/Microsoft.AspNetCore.Server.IIS.netcoreapp3.0.cs @@ -19,13 +19,6 @@ public static partial class WebHostBuilderIISExtensions public static Microsoft.AspNetCore.Hosting.IWebHostBuilder UseIIS(this Microsoft.AspNetCore.Hosting.IWebHostBuilder hostBuilder) { throw null; } } } -namespace Microsoft.AspNetCore.Http.Features -{ - public partial interface IServerVariablesFeature - { - string this[string variableName] { get; set; } - } -} namespace Microsoft.AspNetCore.Server.IIS { public sealed partial class BadHttpRequestException : System.IO.IOException @@ -35,6 +28,7 @@ internal BadHttpRequestException() { } } public static partial class HttpContextExtensions { + [System.ObsoleteAttribute("This is obsolete and will be removed in a future version. Use GetServerVariable instead.")] public static string GetIISServerVariable(this Microsoft.AspNetCore.Http.HttpContext context, string variableName) { throw null; } } public partial class IISServerDefaults diff --git a/src/Servers/IIS/IIS/samples/NativeIISSample/Startup.cs b/src/Servers/IIS/IIS/samples/NativeIISSample/Startup.cs index 216dcea3b89d..96c77e15cb4a 100644 --- a/src/Servers/IIS/IIS/samples/NativeIISSample/Startup.cs +++ b/src/Servers/IIS/IIS/samples/NativeIISSample/Startup.cs @@ -80,7 +80,7 @@ public void Configure(IApplicationBuilder app) foreach (var varName in IISServerVarNames) { - await context.Response.WriteAsync(varName + ": " + context.GetIISServerVariable(varName) + Environment.NewLine); + await context.Response.WriteAsync(varName + ": " + context.GetServerVariable(varName) + Environment.NewLine); } await context.Response.WriteAsync(Environment.NewLine); diff --git a/src/Servers/IIS/IIS/src/AssemblyInfo.cs b/src/Servers/IIS/IIS/src/AssemblyInfo.cs index 5f58cf6c8ed8..6f83e91b28ce 100644 --- a/src/Servers/IIS/IIS/src/AssemblyInfo.cs +++ b/src/Servers/IIS/IIS/src/AssemblyInfo.cs @@ -2,7 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Runtime.CompilerServices; +using Microsoft.AspNetCore.Http.Features; [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Server.IISIntegration.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("IIS.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: TypeForwardedTo(typeof(IServerVariablesFeature))] diff --git a/src/Servers/IIS/IIS/src/HttpContextExtensions.cs b/src/Servers/IIS/IIS/src/HttpContextExtensions.cs index 9c0092d3fe5f..de1d53a5aa4a 100644 --- a/src/Servers/IIS/IIS/src/HttpContextExtensions.cs +++ b/src/Servers/IIS/IIS/src/HttpContextExtensions.cs @@ -1,6 +1,7 @@ // 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 Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; @@ -17,22 +18,11 @@ public static class HttpContextExtensions /// The http context for the request. /// The name of the variable. /// - /// null if the feature does not support the feature. + /// null if the server does not support the feature. /// May return null or empty if the variable does not exist or is not set. /// - /// - /// For a list of common server variables available in IIS, see http://go.microsoft.com/fwlink/?LinkId=52471. - /// - public static string GetIISServerVariable(this HttpContext context, string variableName) - { - var feature = context.Features.Get(); - - if (feature == null) - { - return null; - } - - return feature[variableName]; - } + [Obsolete("This is obsolete and will be removed in a future version. Use " + nameof(HttpContextServerVariableExtensions.GetServerVariable) + " instead.")] + public static string GetIISServerVariable(this HttpContext context, string variableName) => + context.GetServerVariable(variableName); } } diff --git a/src/Servers/IIS/IIS/src/Microsoft.AspNetCore.Server.IIS.csproj b/src/Servers/IIS/IIS/src/Microsoft.AspNetCore.Server.IIS.csproj index dd160c168a3b..e72a107035ab 100644 --- a/src/Servers/IIS/IIS/src/Microsoft.AspNetCore.Server.IIS.csproj +++ b/src/Servers/IIS/IIS/src/Microsoft.AspNetCore.Server.IIS.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.0 @@ -35,6 +35,8 @@ + + diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj b/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj index 69852cbf8188..a27cd396a876 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj +++ b/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj @@ -30,14 +30,30 @@ - - - - - - - - + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs index 807301c7b239..b7986cb87bfa 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs @@ -47,8 +47,11 @@ private void WebSocketEcho(IApplicationBuilder app) app.Run(async context => { var ws = await Upgrade(context); - +#if FORWARDCOMPAT + var appLifetime = app.ApplicationServices.GetRequiredService(); +#else var appLifetime = app.ApplicationServices.GetRequiredService(); +#endif await Echo(ws, appLifetime.ApplicationStopping); }); diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs index 1825ac7a1dd7..9b2011346ec3 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs @@ -26,6 +26,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Primitives; using Xunit; +using HttpFeatures = Microsoft.AspNetCore.Http.Features; namespace TestSite { @@ -35,15 +36,20 @@ public void Configure(IApplicationBuilder app) { TestStartup.Register(app, this); } - + public void ConfigureServices(IServiceCollection serviceCollection) { serviceCollection.AddResponseCompression(); } +#if FORWARDCOMPAT + private async Task ContentRootPath(HttpContext ctx) => await ctx.Response.WriteAsync(ctx.RequestServices.GetService().ContentRootPath); + private async Task WebRootPath(HttpContext ctx) => await ctx.Response.WriteAsync(ctx.RequestServices.GetService().WebRootPath); +#else private async Task ContentRootPath(HttpContext ctx) => await ctx.Response.WriteAsync(ctx.RequestServices.GetService().ContentRootPath); private async Task WebRootPath(HttpContext ctx) => await ctx.Response.WriteAsync(ctx.RequestServices.GetService().WebRootPath); +#endif private async Task CurrentDirectory(HttpContext ctx) => await ctx.Response.WriteAsync(Environment.CurrentDirectory); @@ -118,7 +124,11 @@ public async Task WaitingRequestCount(HttpContext context) public Task CreateFile(HttpContext context) { +#if FORWARDCOMPAT + var hostingEnv = context.RequestServices.GetService(); +#else var hostingEnv = context.RequestServices.GetService(); +#endif if (context.Connection.LocalIpAddress == null || context.Connection.RemoteIpAddress == null) { @@ -434,7 +444,11 @@ private async Task ReadAndCountRequestBody(HttpContext ctx) private async Task WaitForAppToStartShuttingDown(HttpContext ctx) { await ctx.Response.WriteAsync("test1"); +#if FORWARDCOMPAT + var lifetime = ctx.RequestServices.GetService(); +#else var lifetime = ctx.RequestServices.GetService(); +#endif lifetime.ApplicationStopping.WaitHandle.WaitOne(); await ctx.Response.WriteAsync("test2"); } @@ -797,7 +811,11 @@ private async Task BasePath(HttpContext ctx) private async Task Shutdown(HttpContext ctx) { await ctx.Response.WriteAsync("Shutting down"); +#if FORWARDCOMPAT + ctx.RequestServices.GetService().StopApplication(); +#else ctx.RequestServices.GetService().StopApplication(); +#endif } private async Task ShutdownStopAsync(HttpContext ctx) @@ -844,8 +862,8 @@ private async Task GetServerVariableStress(HttpContext ctx) // This test simulates the scenario where native Flush call is being // executed on background thread while request thread calls GetServerVariable // concurrent native calls may cause native object corruption - var serverVariableFeature = ctx.Features.Get(); + await ctx.Response.WriteAsync("Response Begin"); for (int i = 0; i < 1000; i++) {