Getting "No type was found that matches the controller named 'SampleSlashBaseService'" when trying to use WebAPI

29,474

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.

Share:
29,474
azzlack
Author by

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, 2022

Comments

  • azzlack
    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
    skovy almost 10 years
    I did something along the opposite lines. I had Controller where it wasn't supposed to be! defaults: new { controller = "APIController" } should be defaults: new { controller = "API" } You must OMIT Controller in your WebApiConfig.cs!
  • Dr Schizo
    Dr Schizo over 9 years
    That's what happened to me where I left the Controller suffix on the WebApiConfig.cs. Your comment helped me :)
  • George Harnwell
    George Harnwell about 9 years
    I was pulling my hair out before I found this. What a silly error to make. THANK YOU
  • Peter Albert
    Peter Albert almost 9 years
    Stupid as it might sound: Make sure that you suffix it with Controller, not Controlller! Just spent 30' wondering what on earth is going on...
  • Eranga
    Eranga over 8 years
    this 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
    Zach Smith over 6 years
    i really wish that frameworks didn't make stupid opaque requirements about how classes are named
  • Kas
    Kas over 6 years
    you saved my day! :P
  • dpberry178
    dpberry178 about 3 years
    Thank you! This helped me. I was inheriting from System.Web.Mvc.Controller, but I wanted to be inheriting from System.Web.Http.ApiController.