【问题标题】:No type was found that matches controller找不到与控制器匹配的类型
【发布时间】:2019-03-05 19:11:29
【问题描述】:

我正在使用 web api 构建我的第一个应用程序,但我偶然发现了一个我无法找到相关信息的问题。

使用示例控制器测试其是否正常工作:

public class TestController : ApiController
{
    // GET api/test
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

每次我尝试使用http://localhost:59502/api/test 调用服务时 我得到了

<Error>
  <Message>
    No HTTP resource was found that matches the request URI 'http://localhost:59502/api/test'.
  </Message>
  <MessageDetail>
    No type was found that matches the controller named 'test'.
  </MessageDetail>
</Error>

谁能指出我做错了什么?

【问题讨论】:

  • 如果您删除 config.MapHttpAttributeRoutes() 是否有效?我可能是错的,但如果您使用该选项,我认为您还需要使用路由上的属性,例如[Route("api/test/{id}")]
  • 刚试过 - 还是不行。 :(
  • @Savio,为什么"test" 会路由到“Get”?
  • @KirkWoll 当您从 VS2013 创建 WebApi 项目(使用模板)时,它可以工作,控制器有一个 Get 方法,它返回 2 个值,您可以使用 http://localhost:52192/api/values 调用它。我的项目和模板项目的路由看起来都一样。
  • 我刚刚在我正在处理的 WebAPI 项目中尝试了您的代码,它运行良好。您是否在其他任何地方配置路线?

标签: c# asp.net-web-api


【解决方案1】:

为了确定调用哪个操作,框架使用路由表。 Web API 的 Visual Studio 项目模板创建默认路由:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

使用默认路由模板,Web API 使用 HTTP 方法来选择操作。但是,您也可以创建一个路由,其中​​操作名称包含在 URI 中:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

这样你就可以访问你的 url ........./api/test

【讨论】:

  • 添加了额外的路由,不行。我认为问题与无法确定要采取的行动不同,错误是关于没有找到要开始的控制器,我理解它,因为它还没有选择行动。
  • 如果您尝试访问localhost:52192/api/test/Get(按照我的建议更改路由后)是否有效?因为对我来说它工作得很好
【解决方案2】:

我现在实际上已经解决了这个问题 - 通过创建新项目并复制所有类。 现在一切正常。

“您是否尝试过将其关闭再打开?”哦,好吧..

【讨论】:

  • 不想在这里刻薄,但老实说,我认为这不是一个真正的答案。问题是什么?我面临同样的问题,我正在寻求解决它。
  • 只有在我有答案的情况下,我才会留下一个完整详细的答案——我完全按照我写的去做。重新创建项目并移动所有类为我解决了这个问题。
【解决方案3】:

对我来说,问题是由于重命名项目程序集。重命名和重建项目后,旧程序集仍保留在输出(bin)文件夹中,并且与新程序集发生冲突。

【讨论】:

    【解决方案4】:

    我的问题是我没有在文件名中添加“控制器”后缀(复制另一个控制器并重命名)

    只需将Controller添加到文件名和类名的末尾即可。

    【讨论】:

    • 它的控制器类名已经以Controller结尾,因为它是TestController
    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2013-12-21
    • 2013-07-22
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多