public System.Web.Http.Controllers.HttpControllerDescriptor SelectController(System.Net.Http.HttpRequestMessage request) { var routeData = request.GetRouteData(); if (routeData == null) { throw new HttpResponseException(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound)); } string namespaceName = GetRouteVariable <string>(routeData, "namespace"); if (namespaceName == null) { throw new HttpResponseException(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound)); } string controllerName = GetRouteVariable <string>(routeData, "controller"); if (controllerName == null) { throw new HttpResponseException(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound)); } // Find a matching controller. var baseKey = String.Format(CultureInfo.InvariantCulture, "{0}.{1}Controller", namespaceName, controllerName); var key = String.Format("{0}Controller", baseKey); HttpControllerDescriptor controllerDescriptor; if (_controllers.Value.TryGetValue(key, out controllerDescriptor)) // the default should include the "Controller" at the end of the class name { return(controllerDescriptor); } else if (_controllers.Value.TryGetValue(baseKey, out controllerDescriptor)) //explicit class name, sans "Controller" { return(controllerDescriptor); } else if (_duplicates.Contains(key)) { throw new HttpResponseException( request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Multiple controllers were found that match this request.")); } else { throw new HttpResponseException(HttpStatusCode.NotFound); } }