Asp.net WebApi:未找到与名为' xxxx'

时间:2017-02-01 09:30:20

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

我有这个问题似乎很常见,但我所读到的解决方案都没有在我的案例中有效。我试图在现有的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

My 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";
        }
    }
}

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

1 个答案:

答案 0 :(得分:2)

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

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

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