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

时间:2015-07-06 14:44:34

标签: asp.net-mvc asp.net-web-api asp.net-web-api2

TL; TD我已经创建了一个新的WebApi2应用程序并删除了所有默认的MVC guff,所以只留下了WebApi guff。为什么它不起作用。

我创建了一个Web Api 2项目,并且不需要任何非Web Api功能,因此我在创建WebApi路由和控制器之前将其删除。无论我如何尝试访问它,我都无法点击我的新web 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;
    }
}

项目结构

  • App_Start
    • FilterConfig.cs
    • WebApiConfig.cs
  • 控制器
    • TestController.cs
  • 模型
    • TestItem.cs
  • Global.asax中

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

2 个答案:

答案 0 :(得分:2)

您的路线定义如下:

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

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

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

[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) { ...
    } 
}

答案 1 :(得分:1)

无法从提供的代码中看到导致WebApi失败的原因,但这将为您提供最少设置的WebApi。

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

http://localhost:80/api/test(或其正在运行的任何端口)发出 GET 请求,它将返回XML或JSON中的TestItem列表,具体取决于您的客户端http标头。< / p>

<强>的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>