【问题标题】:No type was found that matches the controller named 'User'找不到与名为“用户”的控制器匹配的类型
【发布时间】:2013-07-22 13:53:52
【问题描述】:

我正在尝试导航到其 URL 采用以下格式的页面: localhost:xxxxx/User/{id}/VerifyEmail?secretKey=xxxxxxxxxxxxxxx

我在RouteConfig.cs 文件中添加了一条新路由,所以我的RouteConfig.cs 看起来像这样:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "VerifyEmail",
            url: "User/{id}/VerifyEmail",
            defaults: new { controller = "User", action = "VerifyEmail" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index",
                id = UrlParameter.Optional }
        );
    }
}

不幸的是,当我尝试导航到该 URL 时,我得到了这个页面:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://localhost:52684/User/f2acc4d0-2e03-4d72-99b6-9b9b85bd661a/VerifyEmail?secretKey=e9bf3924-681c-4afc-a8b0-3fd58eba93fe'.
    </Message>
    <MessageDetail>
        No type was found that matches the controller named 'User'.
    </MessageDetail>
</Error>

这是我的用户控制器:

public class UserController : Controller
{

    // GET      /User/{id}/VerifyEmail
    [HttpGet]
    public ActionResult VerifyEmail(string id, string secretKey)
    {
        try
        {
            User user = UsersBL.Instance.Verify(id, secretKey);
            //logger.Debug(String.Format("User %s just signed-in in by email.",
                user.DebugDescription()));
        }
        catch (Exception e)
        {
            throw new Exception("Failed", e);
        }
        return View();
    }
}

请告诉我我做错了什么?

【问题讨论】:

  • 奇怪的是错误以XML文档的形式返回。就好像您使用的是劫持这条路线的 ASP.NET Web API。你在使用 ASP.NET Web API 吗?如果是,它的路由定义是怎样的?
  • 是的,我使用的是 ASP.NET Web API,你可以看到上面的路由定义
  • 不,等一下。您似乎混淆了 ASP.NET Web API 和 ASP.NET MVC。这是两种完全不同的技术。您在问题中显示的是 ASP.NET MVC 路由定义和控制器。 ASP.NET Web API 使用完全不同的堆栈。 ASP.NET Web API 控制器从 ApiController 派生而不是从 Controller 派生,并且不会返回与您的问题中显示的相反的 ActionResults。
  • 我知道。当你创建一个 WEB API 应用程序时,你会得到 HomeController,它继承自 Controller 而不是 ApiController。我的问题不在于我的 WEB API 控制器。我让他们都能正常工作。问题是,除了我可以访问的 HomeController 中的 Index 方法之外,所有其他方法都无法识别,并且出现异常“未找到与名为 'User' 的控制器匹配的类型”

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-mvc-routing asp.net-web-api-routing


【解决方案1】:

在我花了将近 30 分钟试图解决问题后,我找到了导致问题的原因:

我在WebApiConfig.cs 中定义的路由是这样的:

config.Routes.MapHttpRoute(
    name: "ControllersApi",
    routeTemplate: "{controller}/{action}"
);

应该是这样的:

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

如您所见,它干扰了RouteConfig.cs 中定义的标准路由。

【讨论】:

  • 谢谢,花了一个小时!
  • 我面临同样的问题,除了我的路线已经定义了你建议的方式。
  • 在我的例子中,我将路由模板从“api/{controller}/{id}”更新为“api/{controller}/{action}/{id}”,并且成功了。
  • 与干扰配置完全相同的问题。谢谢!
  • 在我的情况下,我的 API 类中没有名称“控制器”。约定优于配置。
【解决方案2】:

在我的例子中,控制器被定义为:

    public class DocumentAPI : ApiController
    {
    }

将其更改为以下有效!

    public class DocumentAPIController : ApiController
    {
    }

类名必须以Controller结尾!

编辑:正如@Corey Alix 所建议的,请确保控制器具有 public 访问修饰符;路由处理程序会忽略非公共控制器!

【讨论】:

  • 这也时不时让我绊倒。
  • 问题已修复。谢谢..:D
  • 也需要公开。
  • ....谢谢:)。如果需要控制器短语,为什么 Visual Studio 允许您创建没有该后置修复的控制器,至少它可以警告您。
  • 很确定这与整个Convention 超过Configuration 的事情有关。 :)
【解决方案3】:

就我而言,我想创建一个 Web API 控制器,但由于注意力不集中,我的控制器继承自 Controller 而不是 ApiController。

【讨论】:

  • 太棒了!就是这样。
【解决方案4】:

在我的例子中,路由定义为:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "WarehouseController" }

Controller 需要放在配置中:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "Warehouse" }

【讨论】:

  • 为我做到了。
【解决方案5】:

另一种解决方案是将控制器类权限设置为公共。

设置这个:

class DocumentAPIController : ApiController
{
}

到:

public class DocumentAPIController : ApiController
{
}

【讨论】:

  • 非常感谢。我在这上面花了大约 10 个小时,最后你帮了忙
【解决方案6】:

遇到了类似的问题。我们正在处理多个 API,并且我们遇到了错误的端口号并收到此错误。让我们永远意识到。确保您访问的 api 端口是正确的端口。

【讨论】:

  • 这对我真的很有帮助。我正在处理多个 API,但我们打错了。谢谢老兄
【解决方案7】:

在我的例子中,我看到这个是因为我有两个同名的控制器:

一个用于处理客户订单,称为CustomersController,另一个用于获取事件,也称为CustomersController

我错过了重复,我将事件一重命名为 CustomerEventsController 并且效果很好

【讨论】:

    【解决方案8】:

    就我而言,我使用的是 Web API,但我没有为我的控制器类定义 public

    检查 Web API 的事项:

    • 控制器类声明为public
    • Controller 类实现 ApiController : ApiController
    • 控制器类名需要以Controller结尾
    • 检查您的网址是否有/api/ 前缀。例如。 'host:port/api/{controller}/{actionMethod}'

    【讨论】:

    • 完美!!您能否在映射中添加比我们应该放置 [controller ="User"] 而不是 [controller ="UserController"]
    【解决方案9】:

    我也遇到了同样的问题。我搜索了很多,发现需要类级别的权限。默认情况下,类权限级别是内部的,所以我认为它不会影响程序执行。但实际上它受到了影响,您应该将您的班级权限设为公开,这样您就不会遇到任何问题。

    还有一个。如果是 webapi 项目,您的 webapirouteconfig 文件将覆盖 routeconfig.cs 文件设置。所以也要更新 webapi routeconfig 文件才能正常工作。

    【讨论】:

      【解决方案10】:

      在我的解决方案中,我有一个名为“P420”的项目,而在其他项目中我有一个 P420Controller。

      .NET剪切控制器名查找路由时,与其他项目冲突,作为库进入。

      希望对你有帮助。

      【讨论】:

        【解决方案11】:

        在我的解决方案中,当我将新控制器添加到项目中时,向导询问我是否要将控制器的位置设置到 App_Code 文件夹中。 向导警告我,如果我没有在 App_Code 文件夹中找到它,将找不到控制器类型。 但我没有阅读整个警告,因为我想将文件定位到其他地方.. 所以这就是为什么它对我不起作用。

        在我添加了一个新控制器并让它默认在 App_Code 中之后,一切正常。

        【讨论】:

          【解决方案12】:

          面临同样的问题。在这里检查了所有答案,但我的问题在于命名空间。 路由属性存在于 System.Web.Mvc 和 System.Web.Http 中。我的 usings 包括 Mvc 命名空间,这就是原因。对于 webapi,您需要使用 System.Net.Http

          【讨论】:

            【解决方案13】:

            在我的例子中,我是这样称呼 APi 的

            http://locahost:56159/api/loginDataController/GetLoginData

            应该是这样的

            http://locahost:56159/api/loginData/GetLoginData

            从 URL 中删除 Controller 并开始工作...

            和平!

            【讨论】:

              【解决方案14】:

              在我的情况下,这是 WebHostHttpControllerTypeResolver 过度缓存的情况。

              修复:

              1. 删除此路径下的所有文件(或者在我的情况下,只是任何名为“MS-ApiControllerTypeCache.xml”的文件):

                C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root

              2. 重启应用程序池

              信用:https://sitecore.stackexchange.com/questions/9897/webapi-controllers-not-being-found-in-sitecore-8-2

              【讨论】:

                【解决方案15】:

                还有一个很好的答案......

                在我的情况下,有人意外添加了另一个项目作为引用,该引用引入了该项目的所有控制器并导致路由冲突。删除它并将所需的代码从它移到一个更好的地方,可以在不引入所有控制器的情况下引用它是解决方案。

                【讨论】:

                  猜你喜欢
                  • 2020-02-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多