将 Web Api 添加到现有 MVC 项目 - 找不到与名为 "x" 的控制器匹配的类型

Adding WebApi to existing MVC project - No type found that maches the controller named "x"

我最近问了一些有关创建 Web api 的最佳方法的问题,该 Web api 使用与我的主要 mvc 站点相同的 url。我推断最好的方法是对我的 MVC 站点进行必要的更改以包括 web api 和必要的路由。

我主要关注 How to add Web API to an existing ASP.NET MVC 4 Web Application project? 但我 运行 遇到了问题。代码编译正常,它显然正在寻找路线,但我收到错误:

No HTTP resource was found that matches the request URI 'http://localhost:2242/api/value'. No type was found that matches the controller named 'value'.

我的 WebApiConfig:

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

我的global.asax:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        Database.SetInitializer<ApplicationDbContext>(null);
    }
}

我的api控制器:

public class ValuesController1 : ApiController
{
    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/<controller>
    public void Post([FromBody]string value)
    {
    }

    // PUT api/<controller>/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/<controller>/5
    public void Delete(int id)
    {
    }
}

其他帖子证实这是一个正确且有效的设置...我创建了一个单独的 webapi 项目进行比较,这显然是正确的路由选择。最好将其构建到我的 MVC 网站中,有人有任何想法吗?这位发帖者 No type was found that matches controller 遇到了同样的问题,他找到的解决方案是将所有内容复制到一个新项目中....这真的不是我想要的 do/see 为什么我需要这样做。

我认为这是因为您的控制器名称:ValuesController1

控制器必须以 "Controller" 为后缀,1 可能是您问题的原因。

控制器的名称 ValuesController1 与约定不匹配 - 为了使默认路由匹配 /api/value 根据您在调用 configuration.Routes.MapHttpRoute(...) 时设置的默认约定,控制器应称为 ValueController:

public class ValueController : ApiController
{
    public IEnumerable<string> Get()
    // ...

但是,如果您打算偏离配置的约定,则可以应用 RouteAttribute and RoutePrefixAttribute 结合 Http* 动词属性来自定义控制器和方法路由,例如

[RoutePrefix("api/Foo")]
public class ValuesController : ApiController
{
    // get api/Foo/value
    [HttpGet]
    [Route("value")] 
    public IEnumerable<string> NameDoesntMatter()
    {
        return new string[] { "value1", "value2" };
    }

    // get api/Foo/value/123
    [HttpGet]
    [Route("value/{id}")]
    public string AnotherRandomName(int id)
    {
        return "value";
    }

在使用 RouteAttribute 之前,您需要将以下内容添加到您的 WebApiConfig.Register(HttpConfiguration config)

 config.MapHttpAttributeRoutes();

即使有路由属性,但请注意,控制器class 名称仍需要以后缀Controller 结尾,即不能以后缀1 结尾。 It is surprisingly difficult 更改此约定。