@@ -161,28 +161,64 @@ private void ExtractEndpointRoutes(Func<RequestDelegate, RequestDelegate> middle
161161
162162 foreach ( EndpointDataSource endpointDataSource in endpointDataSources )
163163 {
164- var routeEndpoints = endpointDataSource
164+ var routeEndpoints = new Dictionary < string , RouteEndpoint > ( ) ;
165+
166+ var allRouteEndpoints = endpointDataSource
165167 . Endpoints
166168 . 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 )
171181 {
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 ) ;
177189
178- if ( routeName == null )
190+ routePattern . Defaults . ForEach ( defaultValue =>
179191 {
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 ;
182215
183216 routeBuilder . MapRoute (
184- name : routeName ,
185- routeEndpoint . RoutePattern . RawText ) ;
217+ routeName ,
218+ rawRouteText ,
219+ defaultValues ,
220+ constraints ,
221+ dataTokens ) ;
186222 }
187223 }
188224
0 commit comments