【问题标题】:Adding WebApi to existing MVC project - No type found that maches the controller named "x"将 Web Api 添加到现有 MVC 项目 - 找不到与名为“x”的控制器匹配的类型
【发布时间】:2015-07-09 12:29:54
【问题描述】:

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

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

未找到与请求 URI 'http://localhost:2242/api/value' 匹配的 HTTP 资源。 找不到与名为“值”的控制器匹配的类型。

我的 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 遇到了同样的问题,他找到的解决方案是将所有内容复制到一个新项目中......这真的不是我想做的事情/看看我为什么需要这样做。

【问题讨论】:

  • 控制器的名称 (ValuesController1) 不符合约定 - 为了匹配 /api/value,控制器应称为 ValueController
  • 我的上帝......我几乎很抱歉问这个问题我什至没有注意到它的命名。谢谢....工作正常

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    [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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多