MVC中的web api不再有效

时间:2017-08-07 17:30:04

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

我正在使用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实现,这个让我感到困惑。

2 个答案:

答案 0 :(得分:3)

您应该为您的班级名称添加Controller后缀。

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

当应用程序启动时,asp.net mvc框架会查找具有此后缀的类(继承自ApiControllerController)并在构建路由表时注册它们。当请求到达您的应用程序时,框架会再次查看路由表并将请求定向到相应的控制器和操作方法。

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

答案 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" };
    }
}

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