【问题标题】:404 on new asp.net web api, after route config is setup设置路由配置后,新的 asp.net web api 上的 404
【发布时间】:2021-05-31 01:18:51
【问题描述】:

我有一个运行良好的控制器:

   [Authorize]
    [Route("api/Version")]
    public class VersionController : ApiController
    {

但是,如果我在其他控制器中省略 Route 属性,它将不起作用,当我转到:url/api/User 或 Users 时,我会得到 404

  [Authorize]
    public class UserController : ApiController
    {

我的 webappi 配置

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

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


            config.Services.Add(typeof(IExceptionLogger), new AiExceptionLogger());
        }
    }

我的路由配置

  public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

用户控制器获取用户

  [HttpGet]
        public async Task<IHttpActionResult> GetUsers()
        {
      

【问题讨论】:

  • 显示操作方法的签名和您正在尝试的相关 URL。
  • @Luis Valencia:你在RouteConfig.RegisterRoutes(RouteTable.Routes);之前打电话给GlobalConfiguration.Configure(WebApiConfig.Register);了吗?
  • 我的代码中没有 GlobalConfiguration.Configure
  • 你也尝试过 GET api/User/GetUsers

标签: c# asp.net .net asp.net-mvc asp.net-web-api


【解决方案1】:

您似乎定义了两个不同的配置类,它们在其方法中指定了不同的路由方案:

  • WebApiConfig.Register(...),你有routeTemplate: "api/{controller}/{action}/{id}"
  • RouteConfig.RegisterRoutes(...) 中,您指定了url: "{controller}/{action}/{id}"。 请注意,这些路由相互重叠,因此在您的应用程序中使用这些配置时必须小心。

关于VersionControllerUserController,似乎实际上是Route 属性定义了您的路线。

VersionController 中,如果指定[Route("api/Version")],则可以正确访问/api/version。如果您删除它,您可能能够访问/version 而不是/api/version,或者不是吗? (这可能有助于了解使用了哪些配置 - WebApiConfigRouteConfig 或任何配置。

同样,在UserController 中,如果您没有指定[Route("api/User")],您可能能够访问/user(没有/api 前缀)。请你确认一下好吗?另一方面,如果您定义了Route 属性,那么您应该能够访问api/user

我假设您已经将控制器映射到端点,因为我知道您可以访问 api/version

这个documentation 很好地解释了 MVC 项目中的路由(在本例中,针对 .NET Core),它解释了您可能尝试使用 WebApiConfigRouteConfig 实现的多路由方法。

【讨论】:

  • 惊人的解释,我会检查它是否有效,接受答案,如果没有,我会在这里发表评论。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 2016-08-03
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多