34

我使用 .net 框架 4.5 安装了带有 mvc4 的 Visual Studio 2012。现在我想将 webapi2 与属性写入一起使用,并且我希望我的 hlep 页面正确显示所有端点。

在我的解决方案中,我添加了一个新的 mvc4 基础 emtpy 项目并使用 nuget 升级到 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();
        }


    }
}
4

9 回答 9

53

根据您的信息,您似乎没有调用httpConfig.MapHttpAttributeRoutes()(确保在进行任何传统路由注册之前调用它)

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

于 2013-11-11T13:37:18.613 回答
35

我遇到的一个问题与 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);
}

这确实有效

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
于 2014-04-09T17:52:39.513 回答
25

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

于 2016-12-21T18:00:09.877 回答
13

这不是您的情况(从您的示例代码中可以明显看出),但请记住以Controller.

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

于 2016-06-30T18:02:19.393 回答
5

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

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

我的工作控制器-

public class FooController : ApiController { }

我的非工作控制器-

public class BarControllers : ApiController { }

确保您的控制器类以Controller. 尾声s抓住了我!

于 2017-02-18T19:14:43.667 回答
1

确保您没有两个具有相同名称的控制器!我正在将一些控制器从我扔掉的一个程序集中移到网站中……而该网站不再引用其他程序集所做的旧程序集,这意味着它被复制到了网站 bin 文件夹中。然后,当遇到同一控制器的两次出现时,路由发现过程似乎无声无息地失败了!

于 2019-01-25T10:36:07.047 回答
0

就我而言,VS 使用名称创建我的控制器

TestController1

我不知道他为什么把这个数字“一”放在名字的末尾,但是删除它会起作用。

于 2017-04-02T18:24:00.057 回答
0

就我而言,我在属性中缺少完整的自定义路径。我只写了没有“api/”的自定义操作名称。所以那是我的错误。我的场景是,WebApiConfig 模板代码:

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

我不正确的路线

[RoutePrefix("myapps")]  // wrong code
public class AppsController : BaseRestAPIController
{
    [HttpPost]
    [Route("getapps")]
    public ResponseData GetAppList()
    {

正确的方式

[RoutePrefix("api/myapps")]  // correct way. full path start from 'api/'
public class AppsController : BaseRestAPIController
{
    [HttpPost]
    [Route("getapps")]
    [Route("api/myapps/getapps")] // you can use full path here, if you dont want controller level route
    public ResponseData GetAppList()
    {
于 2020-05-06T01:53:25.397 回答
-5

在我的情况下,以下行正在产生问题,只需对其进行评论,一切都开始工作

config.MapHttpAttributeRoutes();

在 WebApiConfig.cs 文件中注释它

于 2015-08-15T23:10:54.697 回答