@@ -104,13 +104,46 @@ private IEnumerable<HttpControllerDescriptor> EnumerateDirectRoutes()
104
104
var template = subroute . Route . RouteTemplate ;
105
105
var comparer = StringComparer . OrdinalIgnoreCase ;
106
106
var controllers = from route in routes
107
- where comparer . Equals ( route . RouteTemplate , template ) &&
108
- route . DataTokens . ContainsKey ( "controller" )
109
- let controller = route . DataTokens [ "controller" ] as HttpControllerDescriptor
110
- where controller != null
107
+ where comparer . Equals ( route . RouteTemplate , template )
108
+ from controller in EnumerateControllersInDataTokens ( route . DataTokens )
111
109
select controller ;
112
110
113
111
return controllers . Distinct ( ) ;
114
112
}
113
+
114
+ private static IEnumerable < HttpControllerDescriptor > EnumerateControllersInDataTokens ( IDictionary < string , object > dataTokens )
115
+ {
116
+ Contract . Requires ( dataTokens != null ) ;
117
+ Contract . Ensures ( Contract . Result < IEnumerable < HttpControllerDescriptor > > ( ) != null ) ;
118
+
119
+ var value = default ( object ) ;
120
+
121
+ if ( dataTokens . TryGetValue ( "controller" , out value ) )
122
+ {
123
+ var controllerDescriptor = value as HttpControllerDescriptor ;
124
+
125
+ if ( controllerDescriptor != null )
126
+ {
127
+ yield return controllerDescriptor ;
128
+ }
129
+
130
+ yield break ;
131
+ }
132
+
133
+ if ( dataTokens . TryGetValue ( "actions" , out value ) )
134
+ {
135
+ var actionDescriptors = value as HttpActionDescriptor [ ] ;
136
+
137
+ if ( actionDescriptors == null )
138
+ {
139
+ yield break ;
140
+ }
141
+
142
+ foreach ( var actionDescriptor in actionDescriptors )
143
+ {
144
+ yield return actionDescriptor . ControllerDescriptor ;
145
+ }
146
+ }
147
+ }
115
148
}
116
149
}
0 commit comments