Getting "No type was found that matches the controller named 'SampleSlashBaseService'" when trying to use WebAPI
Solution 1
Found the problem.
ApiControllers
class names need to be suffixed with "Controller", and mine was not.
Changing it to SampleSlashBaseController
solved the problem.
NOTE:
It is possible to suffix it with "Service" as I did, but then you have to implement a custom IHttpControllerSelector
like described here: http://netmvc.blogspot.no/2012/06/aspnet-mvc-4-webapi-support-areas-in.html
Solution 2
You also need to make sure the Controller class is Public
Solution 3
In my case the Controller was defined properly, but was not marked public.
Solution 4
In my case, there were two controllers with the same name, in different folders. Renaming them solved the problem instantly.
Solution 5
For what it's worth, I ran into this and my problem was my manually-added class wasn't inheriting from ApiController. The class definition needs to be public class QueueController : ApiController
not public class QueueController
. What a dumb thing to overlook.
azzlack
Umbraco evangelist. Web developer at Miles. Also owner of EyeCatch, a web solutions specialist company. Blogs at http://www.eyecatch.no
Updated on July 09, 2022Comments
-
azzlack almost 2 years
I have a webapi project with a base ApiController named SlashBaseService:
[RouteArea("uBase")] public abstract class SlashBaseService : ApiController { }
The resulting dll is used in a WebForms project so I also have a WebActivator class with the following code to generate routes:
RouteTable.Routes.MapHttpAttributeRoutes(config => { // Get all services inheriting from SlashBaseService foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var type in assembly.GetTypes()) { if (type.IsSubclassOf(typeof(SlashBaseService))) { // Scan assembly config.ScanAssembly(assembly); // Skip the remaining types in this assembly break; } } } }); RouteTable.Routes.MapHttpRoute( name: "DefaultBase", routeTemplate: "base/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
I also have a testservice in a separate assembly:
public class SampleSlashBaseService : SlashBaseService { [GET("TestOpenMethod")] public string GetTestOpenMethod() { return "Hello anonymous!"; } [GET("Echo/{message}")] public string GetEcho(string message) { return message; } }
All pretty simple stuff. The problem is when I try to go to one of the urls this generates i get the following message:
No type was found that matches the controller named 'SampleSlashBaseService'.
The route list from /routes.axd also looks correct.
-
skovy almost 10 yearsI did something along the opposite lines. I had Controller where it wasn't supposed to be!
defaults: new { controller = "APIController" }
should bedefaults: new { controller = "API" }
You must OMITController
in yourWebApiConfig.cs
! -
Dr Schizo over 9 yearsThat's what happened to me where I left the Controller suffix on the WebApiConfig.cs. Your comment helped me :)
-
George Harnwell about 9 yearsI was pulling my hair out before I found this. What a silly error to make. THANK YOU
-
Peter Albert almost 9 yearsStupid as it might sound: Make sure that you suffix it with
Controller
, notControlller
! Just spent 30' wondering what on earth is going on... -
Eranga over 8 yearsthis question is already answered however my comment was the answer for the issue I had. I had the same error however I was missing Public. I wanted to leave this here in case it would help someone else.
-
Zach Smith over 6 yearsi really wish that frameworks didn't make stupid opaque requirements about how classes are named
-
Kas over 6 yearsyou saved my day! :P
-
dpberry178 about 3 yearsThank you! This helped me. I was inheriting from System.Web.Mvc.Controller, but I wanted to be inheriting from System.Web.Http.ApiController.