找不到与名为“用户”的控制器匹配的类型
Posted
技术标签:
【中文标题】找不到与名为“用户”的控制器匹配的类型【英文标题】: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' 的控制器匹配的类型”
【参考方案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 过度缓存的情况。
修复:
删除此路径下的所有文件(或者在我的情况下,只是任何名为“MS-ApiControllerTypeCache.xml”的文件):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root
重启应用程序池
信用:https://sitecore.stackexchange.com/questions/9897/webapi-controllers-not-being-found-in-sitecore-8-2
【讨论】:
【参考方案15】:还有一个很好的答案......
在我的情况下,有人意外添加了另一个项目作为引用,该引用引入了该项目的所有控制器并导致路由冲突。删除它并将所需的代码从它移到一个更好的地方,可以在不引入所有控制器的情况下引用它是解决方案。
【讨论】:
以上是关于找不到与名为“用户”的控制器匹配的类型的主要内容,如果未能解决你的问题,请参考以下文章
找不到名为“my”的模块。找不到名为“mycontroller”的控制器
为啥即使创建了对象,django 也找不到与查询匹配的任何对象