我正在尝试使用URI版本控制,但是对于为什么收到以下错误我有些困惑:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:61496/api/v1/foo/create'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'foo'.
</MessageDetail>
</Error>
控制器
public class FooController : ApiController
{
private readonly IFoo _ifoo;
public FooController(IFoo foo)
{
_ifoo = foo;
}
/// <summary>
/// Return an instance of a Foo object.
/// </summary>
/// <returns></returns>
[Route("api/v1/[controller]/create")]
[HttpGet]
public Foo Create()
{
return _ifoo.Create();
}
}
WebApiConfig
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v1/{controller}/{id}", //v1 specified
defaults: new { id = RouteParameter.Optional }
);
}
更新这项工作,但为什么?
[Route("api/v1/foo/create")]
[HttpGet]
public Foo Create()
{
return _ifoo.Create();
}
答案 0 :(得分:1)
根据显示的配置,您正在使用asp.net-web-api而不是asp.net-core
路由模板中的[controller]
和[action]
之类的令牌替换仅添加到了最新的asp.net-core版本中。
为方便起见,属性路由通过将令牌括在方括号(
[
,]
)中来支持令牌替换。标记[action]
,[area]
和[controller]
被定义路由的动作中的动作名称,区域名称和控制器名称的值替换
这就是为什么当您尝试浏览到[Route("api/v1/[controller]/create")]
时api/v1/foo/create
不起作用的原因,因为前者在所使用的框架版本中被当作文字字符串。