53

我正在尝试导航到其 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();
    }
}

请告诉我我做错了什么?

4

15 回答 15

79

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

    public class DocumentAPI : ApiController
    {
    }

将其更改为以下工作!

    public class DocumentAPIController : ApiController
    {
    }

类名必须以Controller结尾!

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

于 2016-02-03T15:12:38.397 回答
50

就我而言,在花了将近 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.

于 2013-12-16T15:19:01.790 回答
28

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

检查 Web API 的事项:

  • 控制器类声明为public
  • 控制器类实现 ApiController : ApiController
  • 控制器类名需要以Controller
  • 检查您的网址是否有/api/前缀。例如。'主机:端口/api/{控制器}/{actionMethod}'
于 2017-07-26T08:56:50.467 回答
22

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

设置这个:

class DocumentAPIController : ApiController
{
}

至:

public class DocumentAPIController : ApiController
{
}
于 2016-10-07T16:23:58.197 回答
9

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

于 2016-06-03T08:05:00.253 回答
6

就我而言,路由定义为:

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

控制器需要在配置中删除:

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{*catchall}",
            defaults: new { controller = "Warehouse" }
于 2016-09-09T09:50:26.803 回答
3

在我的情况下,我看到了这个,因为我有两个同名的控制器:

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

我错过了重复,我将事件重命名为CustomerEventsController,它工作得很好

于 2017-01-13T16:10:24.727 回答
2

就我而言,这是 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

于 2019-03-27T13:50:49.107 回答
2

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

于 2018-10-13T09:43:08.443 回答
1

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

于 2016-12-01T23:09:26.613 回答
1

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

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

希望能帮助到你。

于 2018-08-10T16:26:35.210 回答
1

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

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

于 2017-08-26T15:08:26.040 回答
0

就我而言,我称 APi 为

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

虽然它应该像

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

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

和平!

于 2018-12-24T13:52:22.500 回答
0

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

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

于 2021-02-03T19:29:34.093 回答
0

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

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

于 2018-09-04T07:49:22.557 回答