【问题标题】:GET api cannot get its argumentsGET api 无法获取其参数
【发布时间】:2017-11-29 14:27:42
【问题描述】:

我有一个简单的 aspnet 核心 api 控制器,当一个 get 动作时,但这个动作不能从查询路径中获取它的参数。是不是我用的 webapi 路由有什么问题?

行动:

    [HttpGet]
    [AllowAnonymous]
    public string Test(string arg) // arg is always null no matter what path I use
    {
        return arg;
    }

路线:

routes.MapAreaRoute(
                name: "ad",
                areaName: "Ad",
                template: "api/{area:exists}/{controller}/{action}/{id}",
                defaults: new { controller = "Ad" }
            );
routes.MapRoute(
                name: "default",
                template: "{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );

日志:

> 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 请求开始 HTTP/1.1 GET http://localhost/api/Ad/Ad/Test/asdfasdf dbug:Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[9] AuthenticationScheme:承载未通过身份验证。 错误:Microsoft.AspNetCore.Routing.RouteConstraintMatcher[1] 带有键“area”的路由值“Ad”与约束“Microsoft.AspNetCore.Routing.Constraints.CompositeRouteConstraint”不匹配。 错误:Microsoft.AspNetCore.Routing.RouteConstraintMatcher[1] 带有键“area”的路由值“Ad”与约束“Microsoft.AspNetCore.Routing.Constraints.CompositeRouteConstraint”不匹配。 调试:Microsoft.AspNetCore.Routing.RouteBase[1] 请求成功匹配名称为“ad”和模板“api/{area:exists}/{controller}/{action}/{id}”的路由。 dbug:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 执行动作 Api.Areas.Ad.Controllers.AdController.Test (Api) 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 使用参数 () 执行操作方法 Api.Areas.Ad.Controllers.AdController.Test (Api) - ModelState 有效 dbug:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] 执行动作方法Api.Areas.Ad.Controllers.AdController.Test(Api),返回结果Microsoft.AspNetCore.Mvc.ObjectResult。 dbug:Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[4] 未找到执行内容协商请求的信息。 dbug:Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[2] 选择输出格式化程序“Microsoft.AspNetCore.Mvc.Formatters.HttpNoContentOutputFormatter”和内容类型“”来写入响应。 信息:Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1] 执行 ObjectResult,写入值 Microsoft.AspNetCore.Mvc.ControllerContext。 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] 在 193.6691 毫秒内执行动作 Api.Areas.Ad.Controllers.AdController.Test (Api) dbug:Microsoft.AspNetCore.Server.Kestrel[9] 连接 ID“0HL9N6GCMPEP7”完成保持活动响应。 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在 218.2123 毫秒内完成 204

【问题讨论】:

  • "api/{area:exists}/{controller}/{action}/{id}"area:exists 应该是ad。好像您已将请求发送至api/Ad/Ad/Test/asdfasdf
  • 我尝试使用ad,同样的问题,参数为空。我还读到路由匹配不区分大小写,所以它不应该是问题。
  • 尝试将 arg 重命名为 id。但是从您的响应中获取它,您的路径是正确的,并且您确实进入了 API 控制器方法吗?
  • 是的,如果我在函数内部设置断点,它就会被命中,只是 arg 为 null。
  • 换成 [HttpGet("{arg}")] 是否有效?

标签: asp.net-core asp.net-core-routing


【解决方案1】:

如果异常中显示的URI(http://localhost/api/Ad/Ad/Test/asdfasdf)允许你进入方法。这两种解决方案之一应该可以工作:

1: 从路由中删除 /{id} 并更改您的请求 Uri: http://localhost/api/Ad/Ad/Test?args=asdfasdf

2: 要么在路由中重命名/{id} /{args} 或将方法的参数重命名为 ID。

【讨论】:

  • 嗯,我以为参数被当作位置参数,不管参数使用什么名字......
  • 从我的经验来看不是很多。您要么必须添加很多路由模板,要么在方法级别使用[Route("{param1}/{pram2}")]。或者完全删除 {/ID} 并在 URI 末尾使用 ?param1=value&param2=value2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多