没有 MVC 路由配置的 WebApi 2 路由不起作用

WebApi 2 routing without MVC route config isn't working

TL;TD 我创建了一个新的 WebApi2 应用程序并删除了所有默认的 MVC 废话,因此只保留了 WebApi 废话。为什么它不起作用。

我已经创建了一个 Web Api 2 项目并且不需要任何非 Web Api 功能,所以我在创建我的 WebApi 路由和控制器之前删除了它。无论我如何尝试访问它,我都无法点击我的新网络 api 控制器操作。下面的代码片段;

Global.asax

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    }
}

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{action}/{id}"
        );
    }
}

TestController.cs

public class TestController : ApiController
{
    public IEnumerable<TestItem> Get()
    {
        var updates = new List<TestItem>()
        {
            new TestItem()
            {
                Title = "Testing Testing",
                Content = "Testing Content",
                Date = DateTime.Now
            }
        };

        return updates;
    }
}

项目结构

我完全不知所措,我确定我错过了一些明显的东西。

无法从提供的代码中查看导致您的 WebApi 失败的原因,但这将为您提供一个只需最少设置即可工作的 WebApi。

旁注,FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters) 用于 MVC 过滤器,WebApi 不使用。您应该在 WebApiConfig.cs 文件中使用 config.Filters.Add(new SomeFilter())

http://localhost:80/api/test(或运行所在的任何端口)发出GET请求,它将return一个TestItem列表在 XML 或 JSON 中,具体取决于您的客户 http headers.

Global.asax.cs

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

TestController.cs

public class TestController : ApiController
{
    public IEnumerable<TestItem> Get()
    {
        var updates = new List<TestItem>()
        {
            new TestItem()
            {
                Title = "Testing Testing",
                Content = "Testing Content",
                Date = DateTime.Now
            }
        };

        return updates;
    }
}

TestItem.cs

public class TestItem
{
    public TestItem()
    {
    }

    public string Content { get; set; }
    public DateTime Date { get; set; }
    public string Title { get; set; }
}

我安装了以下 nuget 包:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" />
</packages>

您的路线定义如下:

config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "{controller}/{action}/{id}"
);

这是一条分为 3 段的路线;即 http://localhost/Test/Get/1。但是,您没有任何与此匹配的操作。您唯一的操作匹配 http://localhost/Test/Get/.

您可以通过将 defaults: new { id = RouteParameter.Optional } 添加到您的 Http 路由来更正此问题。但是,我强烈建议您考虑改用 Attribute based Routing。使用属性路由,您可以使用控制器中的属性来管理路由,而不是使用神奇的字符串路由 table。例如:

[RoutePrefix("Test")]
public class TestController : ApiController {

    // http://localhost/Test/Get
    [Route("Get")]
    public IEnumerable<TestItem> Get() { ...
    }

    //http://localhost/Test/Get/1
    [Route("Get/{id}")
    public TestItem Get(int id) { ...
    } 
}