【问题标题】:web api in MVC no longer workingMVC 中的 web api 不再工作
【发布时间】:2018-01-15 02:14:14
【问题描述】:

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

【问题讨论】:

  • 尝试将您的控制器重命名为 TestApiController。
  • 谢谢...试过了,但仍然得到相同的错误,只有控制器名为更改。
  • @patcapozzi 显示 WebApiConfig.cs.
  • 将 WebApiConfig.cs 添加到问题中
  • 我认为如果您使用名称TestApiController,它应该可以工作。尝试创建名称为 ProductController 的新 Web api 并检查它是否正常工作。

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


【解决方案1】:

你应该在你的类名中添加Controller 后缀。

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

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

进行此更改,重新构建您的项目,然后重试。

【讨论】:

  • 啊,是的“控制器命名约定”我现在确实记得了。还要感谢 Scott Hannen
【解决方案2】:

除了已经提供的答案(顺便说一句,这是正确的),您还可以考虑使用属性路由而不是基于约定的路由,在这种情况下,控制器的名称是什么并不重要。

您已经启用它基于 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

【讨论】:

  • 我完全同意。如果没有基于属性的路由,WebApi 会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多