asp.net webapi 2属性路由不起作用

Posted

技术标签:

【中文标题】asp.net webapi 2属性路由不起作用【英文标题】:asp.net webapi 2 attribute routing not working 【发布时间】:2013-11-23 07:21:00 【问题描述】:

我使用 .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();
        


    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

在我的 webapiconfig.cs 里面我现在有这个代码 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(名称:“DefaultApi”,routeTemplate:“api/controller/id”,默认值:new id = RouteParameter.Optional );但它现在给了我以下错误对象尚未初始化。确保在所有其他初始化代码之后在应用程序的启动代码中调用 HttpConfiguration.EnsureInitialized()。 是的,该错误消息是预期的,您需要将现有的 WebApiConfig.Register(GlobalConfiguration.Configuration) 调用更改为 GlobalConfiguration.Configure(WebApiConfig.Register); 来修复它。基本上GlobalConfiguration.Configure(WebApiConfig.Register); 内部会为您调用EnsureInitialized 是的,我找到了另一个解决该问题的答案,一切正常,感谢您的时间。你太棒了 我在 MvcRoutes 和 WebApiRoutes 上苦苦挣扎了很久,这就是答案! MapHttpAttributeRoutes 必须在 MapMvcAttributeRoutes 之前!非常感谢! 我只启用了属性路由。没有基于约定的路由。一切都如你所说。它不起作用。顺便说一句,我已经实现了许多 webapi 项目。我的意思是我不是这方面的新手。这些天我只使用.net core,我不知道我是否错过了过去的一些东西【参考方案2】:

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

【讨论】:

谢谢...将“GlobalConfiguration.Configure(WebApiConfig.Register)”行移到“RouteConfig.RegisterRoutes(RouteTable.Routes)”上方对我有用。 我敢打赌,这与同一应用程序中的 OWIN 和 GlobalConfiguration 有关。我将 MVC4 应用程序更新为 MVC5 + OWIN,这发生了。但这不会发生在我的新 MVC5 +OWIN 应用程序中,它的 Application_Start() 仅包含过滤器、路由和捆绑配置设置。没有 GlobalConfiguration.Configure 调用。而且效果很好。 谢谢,这个让我难过了好久!【参考方案3】:

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

【讨论】:

我遇到了同样的问题。如果您的控制器继承的是 Controller 而不是 ApiController 那么您很可能使用 MVC 版本而不是 Http 版本。 好东西。非常感谢。 为我节省了好几个小时。谢谢 绝对是一个可行的问题;当您遵循其他建议时要注意的一个。谢谢。【参考方案4】:

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

否则config.MapHttpAttributeRoutes(); 不会收到。

【讨论】:

谢谢。在这个问题上救了我:***.com/questions/67925370/… 天哪,你不知道你刚刚救了我多少挫折。几个小时的调试只是为了找到这个。【参考方案5】:

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

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

我的工作控制器-

public class FooController : ApiController  

我的非工作控制器-

public class BarControllers : ApiController  

确保您的控制器类以Controller 结尾。尾随的s 抓住了我!

【讨论】:

【参考方案6】:

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

【讨论】:

即使控制器在不同的命名空间中,如果它们具有相同的类名,这似乎会破坏属性路由。【参考方案7】:

在我的例子中,VS 使用名称创建我的控制器

TestController1

我不知道他为什么把这个数字“一”放在名字的末尾,但是删除它就可以了。

【讨论】:

【参考方案8】:

就我而言,我在属性中缺少完整的自定义路径。我只写了没有“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()
    

【讨论】:

【参考方案9】:

在我的情况下,下面一行是造成问题,只是评论它,一切都开始工作了

config.MapHttpAttributeRoutes();

在 WebApiConfig.cs 文件中注释它

【讨论】:

以上是关于asp.net webapi 2属性路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core WebApi Jwt 基于角色的授权不起作用

如果参数名称等于属性名称,则来自查询的 ASP.NET Core Web API 复杂类型绑定不起作用

ASP.Net Core - 使用 WebAPI 和 MVC 前端的 JWT 身份验证不起作用

ASP.NET Identity 2.0 注销不起作用

Sitecore 8.1 中的 Web API 属性路由不起作用

ASP.NET Core 3.0 控制器路由不起作用