2017-08-07 60 views
1

我正在使用VS 2017社区。多年来,我一直在构建web API。但是,由于我无法得到最简单的例子,所以一定会有变化。MVC中的web api不再工作

我在控制器文件夹一个简单的控制器

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

我在应用程序所需的代码开始:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

但是,当我尝试用得到这样的测试Web API:

http://localhost:54014/api/testapi 

我总是得到一个XML消息

Error 
Message 
No HTTP resource was found that matches the request URI 
'http://localhost:54014/api/testapi'. 
/Message 
MessageDetail 
No type was found that matches the controller named 'testapi'. 
/MessageDetail 
/Error 

这里是WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

我几个小时到挠头这一点。正如我所说,我已经建立了许多MS Web API实现,这让我感到困惑。

+3

尝试将您的控制器重命名为TestApiController。 –

+0

谢谢......尝试过,但仍然只有名为已更改的控制器才会得到相同的错误。 –

+1

@patcapozzi show * WebApiConfig.cs *。 – Nkosi

回答

3

您应该将Controller后缀添加到您的课程名称中。

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

当应用程序启动时,asp.net的MVC框架查找类建立路由表时,这个后缀(这是从ApiControllerController继承)和注册。当请求发送到您的应用程序时,框架再次查看路由表并将请求指向相应的控制器和操作方法。

进行此更改,重建项目并重试。

+0

啊,是'控制器命名约定'我现在记得它。也感谢Scott Hannen –

0

除了已经提供的答案(这是正确的方式),你还可以考虑使用属性路由而不是基于约定的路由,在这种情况下,控制器的名称无关紧要。

你已经拥有它使基于该WebApiConfig.cs

config.MapHttpAttributeRoutes(); 

所以现在它只是一个将在需要的属性的事

[RoutePrefix("api/testapi")] 
public class TestApi : ApiController { 

    [HttpGet] 
    [Route("")] //Matches GET api/testapi 
    public IEnumerable<string> Get() { 
     return new string[] { "value1", "value2" }; 
    } 
} 

参考:Attribute Routing in ASP.NET Web API 2

+0

我完全同意。没有基于属性的路由,WebApi是有问题的。 –