@@ -161,28 +161,64 @@ private void ExtractEndpointRoutes(Func<RequestDelegate, RequestDelegate> middle
161
161
162
162
foreach ( EndpointDataSource endpointDataSource in endpointDataSources )
163
163
{
164
- var routeEndpoints = endpointDataSource
164
+ var routeEndpoints = new Dictionary < string , RouteEndpoint > ( ) ;
165
+
166
+ var allRouteEndpoints = endpointDataSource
165
167
. Endpoints
166
168
. OfType < RouteEndpoint > ( )
167
- . Where ( e => e . DisplayName . StartsWith ( "Route: " ) )
168
- . OrderBy ( e => e . Order ) ;
169
-
170
- foreach ( var routeEndpoint in routeEndpoints )
169
+ . OrderBy ( route => route . Order )
170
+ . ForEach ( route =>
171
+ {
172
+ var routeNameMetadata = route . Metadata . GetMetadata < IRouteNameMetadata > ( ) ;
173
+ var routeName = routeNameMetadata ? . RouteName ;
174
+ if ( routeName != null && ! routeEndpoints . ContainsKey ( routeName ) )
175
+ {
176
+ routeEndpoints [ routeName ] = route ;
177
+ }
178
+ } ) ;
179
+
180
+ foreach ( var routeEndpointData in routeEndpoints )
171
181
{
172
- var routeName = routeEndpoint
173
- . Metadata
174
- . OfType < RouteNameMetadata > ( )
175
- . FirstOrDefault ( )
176
- ? . RouteName ;
182
+ var routeName = routeEndpointData . Key ;
183
+ var routeEndpoint = routeEndpointData . Value ;
184
+
185
+ var routePattern = routeEndpoint . RoutePattern ;
186
+ var rawRouteText = routePattern . RawText ;
187
+
188
+ var defaultValues = new Dictionary < string , object > ( routePattern . Defaults ) ;
177
189
178
- if ( routeName == null )
190
+ routePattern . Defaults . ForEach ( defaultValue =>
179
191
{
180
- return ;
181
- }
192
+ if ( rawRouteText . Contains ( $ "{ defaultValue . Key } =") )
193
+ {
194
+ defaultValues . Remove ( defaultValue . Key ) ;
195
+ }
196
+ } ) ;
197
+
198
+ var constraints = new Dictionary < string , object > ( ) ;
199
+
200
+ routePattern . Parameters . ForEach ( parameter =>
201
+ {
202
+ parameter . ParameterPolicies . ForEach ( policy =>
203
+ {
204
+ if ( policy . ParameterPolicy is IRouteConstraint routeConstraintPolicy )
205
+ {
206
+ constraints [ parameter . Name ] = routeConstraintPolicy ;
207
+ }
208
+ } ) ;
209
+ } ) ;
210
+
211
+ var dataTokens = routeEndpoint
212
+ . Metadata
213
+ . GetMetadata < IDataTokensMetadata > ( )
214
+ ? . DataTokens ;
182
215
183
216
routeBuilder . MapRoute (
184
- name : routeName ,
185
- routeEndpoint . RoutePattern . RawText ) ;
217
+ routeName ,
218
+ rawRouteText ,
219
+ defaultValues ,
220
+ constraints ,
221
+ dataTokens ) ;
186
222
}
187
223
}
188
224
0 commit comments