【问题标题】:Asp.net WebApi : No type was found that matches the controller named 'xxxx'Asp.net WebApi:找不到与名为“xxxx”的控制器匹配的类型
【发布时间】:2022-01-10 21:45:42
【问题描述】:

我遇到的这个问题似乎很常见,但我读到的解决方案都没有在我的情况下起作用。我正在尝试在现有 MVC 项目中添加 ApiController。

当我尝试访问 http://localhost:51362/api/test 上添加的控制器时,我收到此错误:{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:51362/api/test'.","MessageDetail":"No type was found that matches the controller named 'test'."}

我的项目包含以下 NuGet 包:

  • Microsoft.AspNet.Mvc 5.2.3
  • Microsoft.AspNet.WebApi 5.2.3
  • Microsoft.AspNet.WebApi.Client 5.2.3
  • Microsoft.AspNet.WebApi.Core 5.2.3
  • Microsoft.AspNet.WebApi.WebHost 5.2.3

我的 Global.asax.cs(摘录):

RouteTable.Routes.Clear();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteTable.Routes.MapMvcAttributeRoutes();
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);

我的 WebApiConfig.cs:

using System.Web.Http;

namespace End.Web
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

            // Web API routes
            config.MapHttpAttributeRoutes();

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

我的新控制器:

using System.Web.Http;

namespace End.Web.Controllers
{
    public class TestController : ApiController
    {
        public string Get()
        {
            return "ok";
        }
    }
}

我也尝试了属性路由,但没有成功。我想做的似乎很简单。我错过了什么明显的东西吗?

【问题讨论】:

  • 您是否尝试为Get() 操作设置[HttpGet] 属性?
  • @Roma Web API v2 自动根据方法名称映射 HTTP 动词 - 这应该不是必需的
  • 你能仔细检查你的 WebApiConfig.Register 方法是否真的被命中了吗?
  • @Roma 刚刚尝试 [HttpGet],结果相同。
  • @Anestis Kivranoglou 刚试过这个网址,也不起作用(同样的错误)。

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


【解决方案1】:

我知道这是一个老问题,但由于它从未得到公认的答案,我会试一试。

我也有这个确切的问题。对我来说,这解决了这个问题:

GlobalConfiguration.Configure(config =>
{
    config.Services.Replace(typeof(IHttpControllerTypeResolver), new DefaultHttpControllerTypeResolver());
    ...
});

在我的例子中,WebHostHttpControllerTypeResolver 被用来代替 DefaultHttpControllerTypeResolverWebHostHttpControllerTypeResolver 首先从缓存(文件)中读取控制器类型,如果该文件存在,则将其内容序列化并返回。如果文件不存在,WebHostHttpControllerTypeResolver 会调用 DefaultHttpControllerTypeResolver

我首先设置了 web api,但没有任何 API 控制器时遇到了问题。这导致缓存了控制器类型的空列表,因此出现了问题。由于控制器类型缓存在文件中,因此即使您重新启动 Web API,它的内容也不会被删除。

另一个解决方案可能是删除存储控制器类型缓存列表的文件。该文件名为MS-ApiControllerTypeCache.xml,应位于文件夹C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root 中的某个位置。

WebHostHttpControllerTypeResolver.cs

【讨论】:

  • 好吧,老实说,我不知道这是否也是我的问题......我什至不记得我最初是在哪个项目中遇到这个问题 :) 但我会接受你的回答因为这看起来很可能是同一个问题。
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多