route - web api rest c#
Obteniendo "No se encontró ningún tipo que coincida con el controlador llamado ''SampleSlashBaseService''" al intentar usar WebAPI (5)
Tengo un proyecto webapi con un ApiController base llamado SlashBaseService:
[RouteArea("uBase")]
public abstract class SlashBaseService : ApiController
{
}
El dll resultante se usa en un proyecto de WebForms así que también tengo una clase WebActivator con el siguiente código para generar rutas:
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 });
También tengo un servicio de prueba en un ensamble por separado:
public class SampleSlashBaseService : SlashBaseService
{
[GET("TestOpenMethod")]
public string GetTestOpenMethod()
{
return "Hello anonymous!";
}
[GET("Echo/{message}")]
public string GetEcho(string message)
{
return message;
}
}
Todas las cosas bastante simples. El problema es cuando trato de ir a una de las direcciones URL que esto genera. Recibo el siguiente mensaje:
No se encontró ningún tipo que coincida con el controlador llamado ''SampleSlashBaseService''.
La lista de rutas de /routes.axd también se ve correcta.
Encontrado el problema
ApiControllers
nombres de clase de ApiControllers
deben tener el sufijo "Controlador" y el mío no. SampleSlashBaseController
a SampleSlashBaseController
resolvió el problema.
NOTA: Es posible IHttpControllerSelector
sufijo "Servicio" como lo hice, pero luego debe implementar un IHttpControllerSelector
personalizado como se describe aquí: http://netmvc.blogspot.no/2012/06/aspnet-mvc-4-webapi -support-areas-in.html
También debe asegurarse de que la clase de controlador sea pública
En mi caso, el controlador se definió correctamente, pero no se marcó como público.
En mi caso, había dos controladores con el mismo nombre, en diferentes carpetas. Renombrarlos resolvió el problema al instante.
Por lo que vale, me encontré con esto y mi problema era que mi clase agregada manualmente no heredaba de ApiController. La definición de clase debe ser de public class QueueController : ApiController
no de public class QueueController
. Qué tonto pasar por alto.