【问题标题】:asp.net webapi 2 attribute routing not workingasp.net webapi 2属性路由不起作用
【发布时间】:2023-03-12 15:07:01
【问题描述】:

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


    }
}

【问题讨论】:

    标签: asp.net-web-api asp.net-web-api-routing


    【解决方案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(); 不会收到。

    【讨论】:

    【解决方案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 文件中注释它

          【讨论】:

            猜你喜欢
            • 2014-03-25
            • 1970-01-01
            • 2015-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-09
            • 2015-09-09
            • 1970-01-01
            相关资源
            最近更新 更多