20

我有一个名为 SlashBaseService 的基础 ApiController 的 webapi 项目:

[RouteArea("uBase")]
public abstract class SlashBaseService : ApiController
{
}

生成的 dll 用于 WebForms 项目,因此我还有一个 WebActivator 类,其中包含以下代码来生成路由:

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 });

我在一个单独的程序集中也有一个测试服务:

public class SampleSlashBaseService : SlashBaseService
{
    [GET("TestOpenMethod")]
    public string GetTestOpenMethod()
    {
        return "Hello anonymous!";
    }

    [GET("Echo/{message}")]
    public string GetEcho(string message)
    {
        return message;
    }
}

所有非常简单的东西。问题是当我尝试转到其中一个生成的 url 时,我收到以下消息:

找不到与名为“SampleSlashBaseService”的控制器匹配的类型。

/routes.axd 中的路由列表看起来也正确。

4

5 回答 5

54

发现了问题。

ApiControllers类名需要以“Controller”为后缀,而我的不是。改变它以SampleSlashBaseController解决问题。

注意:可以像我一样使用“服务”作为后缀,但是您必须实现IHttpControllerSelector如下所述的自定义:http: //netmvc.blogspot.no/2012/06/aspnet-mvc-4-webapi-支持区域in.html

于 2012-07-09T14:02:21.670 回答
11

您还需要确保 Controller 类是Public

于 2015-12-09T01:20:19.030 回答
6

在我的情况下,控制器被正确定义,但没有标记为公共。

于 2015-12-19T18:45:51.643 回答
2

就我而言,在不同的文件夹中有两个同名的控制器。重命名它们立即解决了问题。

于 2015-07-12T14:38:05.227 回答
2

对于它的价值,我遇到了这个问题,我的问题是我手动添加的类没有从 ApiController 继承。类定义必须public class QueueController : ApiController不是public class QueueController。多么愚蠢的事情可以忽略。

于 2017-04-25T15:16:04.350 回答