将WebApi添加到现有的MVC项目 - 没有找到类型为“x”的控制器的类型

时间:2015-07-09 12:29:55

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

我最近问了一些关于创建网络API的最佳方法的问题,该网址使用与我的主要mvc网站相同的网址。我推断出最好的方法是对我的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资源。         未找到与名为“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有同样的问题,他找到的解决方案是将所有内容复制到一个新项目中....这不是我想做的事情/看我为什么需要这样做。

2 个答案:

答案 0 :(得分:2)

我认为这是因为您的Controller名称:ValuesController1

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

答案 1 :(得分:1)

控制器ValuesController1的名称与约定不匹配 - 为了使默认路由与/api/value中的默认约定相匹配,configuration.Routes.MapHttpRoute(...),控制器应该被称为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改变这个惯例。