asp.net webapi 2属性路由无法正常工作

naj*_*jam 33 asp.net-web-api asp.net-web-api-routing

我使用.net framework 4.5安装了使用mvc4的visual studio 2012.现在我想使用带有属性编写的webapi2,我希望我的hlep页面能够正确显示所有端点.

在我的解决方案中,我添加了一个新的mvc4基础emtpy项目并使用nuget i升级到mvc5,然后我安装了webapi2软件包.最后我已经为webapi2安装了帮助包.

现在,当我使用routeprefix时,我无法在帮助页面上看到任何内容,当我尝试在浏览器中访问我的webapi端点时,它会抛出以下错误.

http://expressiis.com/api/v1/

   <Error>
    <Message>
    No HTTP resource was found that matches the request URI 'http://expressiis.com/api/v1/'.
    </Message>
    <MessageDetail>
    No type was found that matches the controller named 'v1'.
    </MessageDetail>
    </Error>

namespace WebApi.Controllers
{
    [RoutePrefix("api/v1")]
    public class SubscribersController : ApiController
    {
        // GET api/<controller>   
        [Route("")]
        [HttpGet]
        public IQueryable<string> Get()
        {
            return new string[] { "value1", "value2" }.AsQueryable();
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*lla 49

根据您的信息,看起来您没有打电话httpConfig.MapHttpAttributeRoutes()(确保任何传统路由注册之前调用此方法)

由于您尚未调用MapHttpAttributeRoutes,因此您的请求似乎与传统路由匹配,例如api/{controller}.这不起作用,因为匹配传统路线的路线永远不会看到用属性路线装饰的控制器/动作.

  • 是的,该错误消息是预期的,您需要将现有的`WebApiConfig.Register(GlobalConfiguration.Configuration)`调用更改为`GlobalConfiguration.Configure(WebApiConfig.Register);`来修复它.基本上是`GlobalConfiguration.Configure(WebApiConfig.Register);`为你内部调用`EnsureInitialized`. (13认同)
  • 在我的webapiconfig.cs里面我现在有了这个代码config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(name:"DefaultApi",routeTemplate:"api/{controller}/{id}",defaults:new {id = RouteParameter.Optional}); 但它现在给我跟随错误该对象尚未初始化.确保在所有其他初始化代码之后在应用程序的启动代码中调用HttpConfiguration.EnsureInitialized(). (3认同)

Jos*_*h C 34

我遇到的一个问题与Application_Start()中的排序有关.请注意下面的Web API配置顺序:

这不起作用

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    GlobalConfiguration.Configure(WebApiConfig.Register);
}
Run Code Online (Sandbox Code Playgroud)

这确实有效

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢...将"GlobalConfiguration.Configure(WebApiConfig.Register)"行移到"RouteConfig.RegisterRoutes(RouteTable.Routes)"之上,为我工作. (2认同)
  • 我打赌这与OWIN和GlobalConfiguration在同一个应用程序中有关.我将MVC4应用程序更新为MVC5 + OWIN并且发生了这种情况.但这不会发生在我的新MVC5 + OWIN应用程序中,它具有仅包含过滤器,路由和捆绑配置设置的Application_Start().没有GlobalConfiguration.Configure调用.而且效果很好. (2认同)

Kev*_*eil 18

我也有这个问题,经过长时间的搜索,我意识到我正在使用System.Web.Mvc.RouteAttribute而不是System.Web.Http.RouteAttribute 在纠正这个并使用之后config.MapHttpAttributeRoutes() everything worked fine.

  • 我有同样的问题。如果您的控制器继承 Controller 而不是 ApiController 那么您很可能使用 MVC 版本而不是 Http 版本。 (2认同)

小智 11

这不是你的情况(从你的示例代码中可以看出),但请记住用它结束Controller类名Controller.

否则它将不会被接收config.MapHttpAttributeRoutes();.


mic*_*cah 5

这个问题已经有一个选定的答案。但我对自己有不同的解决方案,并认为如果所选答案没有帮助,回复会有所帮助。

对我来说,这是一个愚蠢的错误。我有两个控制器,但只有一个在工作。解决方案是我的控制器类命名不正确!

我的工作控制器-

public class FooController : ApiController { }
Run Code Online (Sandbox Code Playgroud)

我的非工作控制器-

public class BarControllers : ApiController { }
Run Code Online (Sandbox Code Playgroud)

确保您的控制器类以Controller. 尾随s得到了我!