我正在使用VS 2017社区。我多年来一直在构建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);
}
但是,当我尝试使用get like:
测试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实现,这个让我感到困惑。
答案 0 :(得分:3)
您应该为您的班级名称添加Controller
后缀。
public class TestApiController : ApiController
{
// GET api/<controller>
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
当应用程序启动时,asp.net mvc框架会查找具有此后缀的类(继承自ApiController
或Controller
)并在构建路由表时注册它们。当请求到达您的应用程序时,框架会再次查看路由表并将请求定向到相应的控制器和操作方法。
进行此更改,重建项目并重试。
答案 1 :(得分: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" };
}
}