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 身份验证不起作用