Skip to content

Commit c54a720

Browse files
author
N. Taylor Mullen
committed
Clear route values after middleware invocation.
#11233
1 parent 479d5ed commit c54a720

File tree

3 files changed

+63
-27
lines changed

3 files changed

+63
-27
lines changed

src/Http/Routing/src/EndpointRoutingMiddleware.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
using System;
55
using System.Diagnostics;
6-
using System.Runtime.CompilerServices;
76
using System.Threading;
87
using System.Threading.Tasks;
98
using Microsoft.AspNetCore.Http;
9+
using Microsoft.AspNetCore.Http.Features;
1010
using Microsoft.AspNetCore.Routing.Matching;
1111
using Microsoft.Extensions.Logging;
1212

@@ -116,6 +116,9 @@ private async Task SetRoutingAndContinue(HttpContext httpContext)
116116
{
117117
// This allows a second call in a single request (such as from the ErrorHandlerMiddleware) to perform routing again.
118118
httpContext.SetEndpoint(endpoint: null);
119+
120+
var routeValuesFeature = httpContext.Features.Get<IRouteValuesFeature>();
121+
routeValuesFeature?.RouteValues?.Clear();
119122
}
120123
}
121124

src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public async Task UseRouting_ServicesRegistered_NoMatch_DoesNotSetFeature()
7474
}
7575

7676
[Fact]
77-
public async Task UseRouting_ServicesRegistered_Match_DoesNotSetsFeature()
77+
public async Task UseRouting_ServicesRegistered_Match_DoesNotSetFeature()
7878
{
7979
// Arrange
8080
var endpoint = new RouteEndpoint(
@@ -104,7 +104,6 @@ public async Task UseRouting_ServicesRegistered_Match_DoesNotSetsFeature()
104104
// Assert
105105
var feature = httpContext.Features.Get<IEndpointFeature>();
106106
Assert.NotNull(feature);
107-
Assert.Same(endpoint, httpContext.GetEndpoint());
108107
}
109108

110109
[Fact]

src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,26 @@ public async Task Invoke_OnCall_SetsEndpointFeatureAndResetsEndpoint()
102102
Assert.Null(endpointFeature.Endpoint);
103103
}
104104

105+
[Fact]
106+
public async Task Invoke_OnCall_SetsEndpointFeatureAndResetsRouteValues()
107+
{
108+
// Arrange
109+
var httpContext = CreateHttpContext();
110+
var initialRouteData = new RouteData();
111+
initialRouteData.Values["test"] = true;
112+
httpContext.Features.Set<IRoutingFeature>(new RoutingFeature()
113+
{
114+
RouteData = initialRouteData,
115+
});
116+
var middleware = CreateMiddleware();
117+
118+
// Act
119+
await middleware.Invoke(httpContext);
120+
121+
// Assert
122+
Assert.Null(httpContext.GetRouteValue("test"));
123+
}
124+
105125
[Fact]
106126
public async Task Invoke_SkipsRoutingAndMaintainsEndpoint_IfEndpointSet()
107127
{
@@ -162,45 +182,59 @@ public async Task Invoke_BackCompatGetRouteValue_ValueUsedFromEndpointFeature()
162182
{
163183
// Arrange
164184
var httpContext = CreateHttpContext();
185+
var nextCalled = false;
165186

166-
var middleware = CreateMiddleware();
187+
var middleware = CreateMiddleware(next: context =>
188+
{
189+
var routeData = httpContext.GetRouteData();
190+
var routeValue = httpContext.GetRouteValue("controller");
191+
var routeValuesFeature = httpContext.Features.Get<IRouteValuesFeature>();
192+
nextCalled = true;
167193

168-
// Act
169-
await middleware.Invoke(httpContext);
170-
var routeData = httpContext.GetRouteData();
171-
var routeValue = httpContext.GetRouteValue("controller");
172-
var routeValuesFeature = httpContext.Features.Get<IRouteValuesFeature>();
194+
// Assert
195+
Assert.NotNull(routeData);
196+
Assert.Equal("Home", (string)routeValue);
173197

174-
// Assert
175-
Assert.NotNull(routeData);
176-
Assert.Equal("Home", (string)routeValue);
198+
// changing route data value is reflected in endpoint feature values
199+
routeData.Values["testKey"] = "testValue";
200+
Assert.Equal("testValue", routeValuesFeature.RouteValues["testKey"]);
177201

178-
// changing route data value is reflected in endpoint feature values
179-
routeData.Values["testKey"] = "testValue";
180-
Assert.Equal("testValue", routeValuesFeature.RouteValues["testKey"]);
202+
return Task.CompletedTask;
203+
});
204+
205+
// Act & Assert
206+
await middleware.Invoke(httpContext);
207+
Assert.True(nextCalled);
181208
}
182209

183210
[Fact]
184211
public async Task Invoke_BackCompatGetDataTokens_ValueUsedFromEndpointMetadata()
185212
{
186213
// Arrange
187214
var httpContext = CreateHttpContext();
215+
var called = false;
188216

189-
var middleware = CreateMiddleware();
217+
var middleware = CreateMiddleware(next: context =>
218+
{
219+
var routeData = httpContext.GetRouteData();
220+
var routeValue = httpContext.GetRouteValue("controller");
221+
var routeValuesFeature = httpContext.Features.Get<IRouteValuesFeature>();
222+
called = true;
190223

191-
// Act
192-
await middleware.Invoke(httpContext);
193-
var routeData = httpContext.GetRouteData();
194-
var routeValue = httpContext.GetRouteValue("controller");
195-
var routeValuesFeature = httpContext.Features.Get<IRouteValuesFeature>();
224+
// Assert
225+
Assert.NotNull(routeData);
226+
Assert.Equal("Home", (string)routeValue);
196227

197-
// Assert
198-
Assert.NotNull(routeData);
199-
Assert.Equal("Home", (string)routeValue);
228+
// changing route data value is reflected in endpoint feature values
229+
routeData.Values["testKey"] = "testValue";
230+
Assert.Equal("testValue", routeValuesFeature.RouteValues["testKey"]);
231+
232+
return Task.CompletedTask;
233+
});
200234

201-
// changing route data value is reflected in endpoint feature values
202-
routeData.Values["testKey"] = "testValue";
203-
Assert.Equal("testValue", routeValuesFeature.RouteValues["testKey"]);
235+
// Act & Assert
236+
await middleware.Invoke(httpContext);
237+
Assert.True(called);
204238
}
205239

206240
[Fact]

0 commit comments

Comments
 (0)