没有 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;
}
}
项目结构
- App_Start
- FilterConfig.cs
- WebApiConfig.cs
- 控制器
- TestController.cs
- 型号
- TestItem.cs
- Global.asax
我完全不知所措,我确定我错过了一些明显的东西。
无法从提供的代码中查看导致您的 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) { ...
}
}
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;
}
}
项目结构
- App_Start
- FilterConfig.cs
- WebApiConfig.cs
- 控制器
- TestController.cs
- 型号
- TestItem.cs
- Global.asax
我完全不知所措,我确定我错过了一些明显的东西。
无法从提供的代码中查看导致您的 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) { ...
}
}