Make CookieTempDataProvider the default ITempDataProvider (#5892)

This commit is contained in:
Ryan Brandenburg 2017-03-07 16:04:47 -08:00 committed by GitHub
parent 4a20c849cb
commit d9d280d1ef
8 changed files with 39 additions and 22 deletions

View File

@ -66,6 +66,28 @@ namespace Microsoft.Extensions.DependencyInjection
return builder; return builder;
} }
/// <summary>
/// Registers <see cref="SessionStateTempDataProvider"/> as the default <see cref="ITempDataProvider"/>
/// in the <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddSessionStateTempDataProvider(this IMvcBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
// Ensure the TempData basics are registered.
MvcViewFeaturesMvcCoreBuilderExtensions.AddViewServices(builder.Services);
var descriptor = ServiceDescriptor.Singleton(typeof(ITempDataProvider), typeof(SessionStateTempDataProvider));
builder.Services.Replace(descriptor);
return builder;
}
/// <summary> /// <summary>
/// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the /// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the
/// <see cref="IServiceCollection"/>. /// <see cref="IServiceCollection"/>.

View File

@ -198,7 +198,7 @@ namespace Microsoft.Extensions.DependencyInjection
// Temp Data // Temp Data
// //
// This does caching so it should stay singleton // This does caching so it should stay singleton
services.TryAddSingleton<ITempDataProvider, SessionStateTempDataProvider>(); services.TryAddSingleton<ITempDataProvider, CookieTempDataProvider>();
// //
// Antiforgery // Antiforgery

View File

@ -7,22 +7,23 @@ using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Internal; using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc.FunctionalTests namespace Microsoft.AspNetCore.Mvc.FunctionalTests
{ {
public class TempDataInCookiesTest : TempDataTestBase, IClassFixture<MvcTestFixture<BasicWebSite.StartupWithCookieTempDataProvider>> public class TempDataInCookiesTest : TempDataTestBase, IClassFixture<MvcTestFixture<BasicWebSite.Startup>>
{ {
public TempDataInCookiesTest(MvcTestFixture<BasicWebSite.StartupWithCookieTempDataProvider> fixture) public TempDataInCookiesTest(MvcTestFixture<BasicWebSite.Startup> fixture)
{ {
Client = fixture.Client; Client = fixture.Client;
} }
protected override HttpClient Client { get; } protected override HttpClient Client { get; }
[Theory] [Theory]
[InlineData(ChunkingCookieManager.DefaultChunkSize)] [InlineData(ChunkingCookieManager.DefaultChunkSize)]
[InlineData(ChunkingCookieManager.DefaultChunkSize * 1.5)] [InlineData(ChunkingCookieManager.DefaultChunkSize * 1.5)]
@ -39,8 +40,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert 1 // Assert 1
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
IEnumerable<string> setCookieValues; Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out IEnumerable<string> setCookieValues));
Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out setCookieValues));
setCookieValues = setCookieValues.Where(cookie => cookie.Contains(CookieTempDataProvider.CookieName)); setCookieValues = setCookieValues.Where(cookie => cookie.Contains(CookieTempDataProvider.CookieName));
Assert.NotEmpty(setCookieValues); Assert.NotEmpty(setCookieValues);
// Verify that all the cookies from CookieTempDataProvider are within the maximum size // Verify that all the cookies from CookieTempDataProvider are within the maximum size
@ -99,8 +99,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert 1 // Assert 1
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
IEnumerable<string> setCookieValues; Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out IEnumerable<string> setCookieValues));
Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out setCookieValues));
var setCookieHeader = setCookieValues var setCookieHeader = setCookieValues
.Select(setCookieValue => SetCookieHeaderValue.Parse(setCookieValue)) .Select(setCookieValue => SetCookieHeaderValue.Parse(setCookieValue))
.FirstOrDefault(setCookieHeaderValue => setCookieHeaderValue.Name == CookieTempDataProvider.CookieName); .FirstOrDefault(setCookieHeaderValue => setCookieHeaderValue.Name == CookieTempDataProvider.CookieName);
@ -153,8 +152,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
IEnumerable<string> setCookieValues; Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out IEnumerable<string> setCookieValues));
Assert.True(response.Headers.TryGetValues(HeaderNames.SetCookie, out setCookieValues));
var setCookieHeader = setCookieValues var setCookieHeader = setCookieValues
.Select(setCookieValue => SetCookieHeaderValue.Parse(setCookieValue)) .Select(setCookieValue => SetCookieHeaderValue.Parse(setCookieValue))
.FirstOrDefault(setCookieHeaderValue => setCookieHeaderValue.Name == CookieTempDataProvider.CookieName); .FirstOrDefault(setCookieHeaderValue => setCookieHeaderValue.Name == CookieTempDataProvider.CookieName);

View File

@ -6,9 +6,9 @@ using Xunit;
namespace Microsoft.AspNetCore.Mvc.FunctionalTests namespace Microsoft.AspNetCore.Mvc.FunctionalTests
{ {
public class TempDataInSessionTest : TempDataTestBase, IClassFixture<MvcTestFixture<BasicWebSite.Startup>> public class TempDataInSessionTest : TempDataTestBase, IClassFixture<MvcTestFixture<BasicWebSite.StartupWithSessionTempDataProvider>>
{ {
public TempDataInSessionTest(MvcTestFixture<BasicWebSite.Startup> fixture) public TempDataInSessionTest(MvcTestFixture<BasicWebSite.StartupWithSessionTempDataProvider> fixture)
{ {
Client = fixture.Client; Client = fixture.Client;
} }

View File

@ -289,7 +289,7 @@ namespace Microsoft.AspNetCore.Mvc
// Assert // Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider)); var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(SessionStateTempDataProvider), descriptor.ImplementationType); Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
} }
[Fact] [Fact]

View File

@ -22,7 +22,7 @@ namespace Microsoft.Extensions.DependencyInjection
// Assert // Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider)); var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(SessionStateTempDataProvider), descriptor.ImplementationType); Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
} }
[Fact] [Fact]

View File

@ -24,9 +24,6 @@ namespace BasicWebSite
services.AddSingleton<IActionDescriptorProvider, ActionDescriptorCreationCounter>(); services.AddSingleton<IActionDescriptorProvider, ActionDescriptorCreationCounter>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<RequestIdService>(); services.AddScoped<RequestIdService>();
services.AddMemoryCache();
services.AddDistributedMemoryCache();
services.AddSession();
} }
public void Configure(IApplicationBuilder app) public void Configure(IApplicationBuilder app)
@ -38,8 +35,6 @@ namespace BasicWebSite
// Initializes the RequestId service for each request // Initializes the RequestId service for each request
app.UseMiddleware<RequestIdMiddleware>(); app.UseMiddleware<RequestIdMiddleware>();
app.UseSession();
// Add MVC to the request pipeline // Add MVC to the request pipeline
app.UseMvc(routes => app.UseMvc(routes =>
{ {
@ -55,4 +50,3 @@ namespace BasicWebSite
} }
} }
} }

View File

@ -6,18 +6,21 @@ using Microsoft.Extensions.DependencyInjection;
namespace BasicWebSite namespace BasicWebSite
{ {
public class StartupWithCookieTempDataProvider public class StartupWithSessionTempDataProvider
{ {
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
// CookieTempDataProvider is the default ITempDataProvider, so we must override it with session.
services services
.AddMvc() .AddMvc()
.AddCookieTempDataProvider(); .AddSessionStateTempDataProvider();
services.AddSession();
} }
public void Configure(IApplicationBuilder app) public void Configure(IApplicationBuilder app)
{ {
app.UseCultureReplacer(); app.UseCultureReplacer();
app.UseSession();
app.UseMvcWithDefaultRoute(); app.UseMvcWithDefaultRoute();
} }
} }