Web API URI版本无法正常工作

时间:2019-02-25 20:54:29

标签: c# asp.net-web-api

我正在尝试使用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();
    }

1 个答案:

答案 0 :(得分:1)

根据显示的配置,您正在使用而不是

路由模板中的[controller][action]之类的令牌替换仅添加到了最新的asp.net-core版本中。

  

为方便起见,属性路由通过将令牌括在方括号([])中来支持令牌替换。标记[action][area][controller]被定义路由的动作中的动作名称,区域名称和控制器名称的值替换

引用Routing to controller actions in ASP.NET Core: Token replacement in route templates ([controller], [action], [area])

这就是为什么当您尝试浏览到[Route("api/v1/[controller]/create")]api/v1/foo/create不起作用的原因,因为前者在所使用的框架版本中被当作文字字符串。

引用Attribute Routing in ASP.NET Web API 2