I have a ValuesController and StudentsController in my application and following routes:
```
config.Routes.MapHttpRoute(
name: "Api2",
routeTemplate: "api/Values/{id}",
defaults: new { id = RouteParameter.Optional, controller = "Values" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
```
I see that ApiExplorer is not generating descriptions for values controller. It generates fine for StudentsController.
I debugged through this and noticed the problem is occurring in the following method of ApiExplorer.cs
```
// remove ApiDescription that will lead to ambiguous action matching.
private static Collection<ApiDescription> RemoveInvalidApiDescriptions(Collection<ApiDescription> apiDescriptions)
{
HashSet<string> duplicateApiDescriptionIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
HashSet<string> visitedApiDescriptionIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (ApiDescription description in apiDescriptions)
{
string apiDescriptionId = description.ID;
if (visitedApiDescriptionIds.Contains(apiDescriptionId))
{
duplicateApiDescriptionIds.Add(apiDescriptionId);
}
else
{
visitedApiDescriptionIds.Add(apiDescriptionId);
}
}
Collection<ApiDescription> filteredApiDescriptions = new Collection<ApiDescription>();
foreach (ApiDescription apiDescription in apiDescriptions)
{
string apiDescriptionId = apiDescription.ID;
if (!duplicateApiDescriptionIds.Contains(apiDescriptionId))
{
filteredApiDescriptions.Add(apiDescription);
}
}
return filteredApiDescriptions;
}
```
```
config.Routes.MapHttpRoute(
name: "Api2",
routeTemplate: "api/Values/{id}",
defaults: new { id = RouteParameter.Optional, controller = "Values" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
```
I see that ApiExplorer is not generating descriptions for values controller. It generates fine for StudentsController.
I debugged through this and noticed the problem is occurring in the following method of ApiExplorer.cs
```
// remove ApiDescription that will lead to ambiguous action matching.
private static Collection<ApiDescription> RemoveInvalidApiDescriptions(Collection<ApiDescription> apiDescriptions)
{
HashSet<string> duplicateApiDescriptionIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
HashSet<string> visitedApiDescriptionIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (ApiDescription description in apiDescriptions)
{
string apiDescriptionId = description.ID;
if (visitedApiDescriptionIds.Contains(apiDescriptionId))
{
duplicateApiDescriptionIds.Add(apiDescriptionId);
}
else
{
visitedApiDescriptionIds.Add(apiDescriptionId);
}
}
Collection<ApiDescription> filteredApiDescriptions = new Collection<ApiDescription>();
foreach (ApiDescription apiDescription in apiDescriptions)
{
string apiDescriptionId = apiDescription.ID;
if (!duplicateApiDescriptionIds.Contains(apiDescriptionId))
{
filteredApiDescriptions.Add(apiDescription);
}
}
return filteredApiDescriptions;
}
```