GET api не может получить свои аргументы

У меня есть простой контроллер api ядра aspnet, когда действие 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: носитель не был аутентифицирован. dbug: Microsoft.AspNetCore.Routing.RouteConstraintMatcher [1] Значение маршрута 'Ad' с ключом 'area' не соответствует ограничению 'Microsoft.AspNetCore.Routing.Constraints.CompositeRouteConstraint'. dbug: Microsoft.AspNetCore.Routing.RouteConstraintMatcher [1] Значение маршрута 'Ad' с ключом 'area' не соответствует ограничению 'Microsoft.AspNetCore.Routing.Constraints.CompositeRouteConstraint'. dbug: 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.Action .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» и тип содержимого »для записи ответа. info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor [1] Выполнение ObjectResult, запись значения Microsoft.AspNetCore.Mvc.ControllerContext. info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [2] Выполненное действие Api.Areas.Ad.Controllers.AdController.Test (Api) в 193.6691ms dbug: Microsoft.AspNetCore.Server.Kestrel [9] Идентификатор подключения "0HL9N6GCMP завершен ответ на сохранение активности. информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен через 218,2123 мс 204


person fluter    schedule 29.11.2017    source источник
comment
"api/{area:exists}/{controller}/{action}/{id}" предлагается area:exists быть ad. Похоже, вы отправили запрос на api/Ad/Ad/Test/asdfasdf   -  person Arno    schedule 29.11.2017
comment
Я пробовал использовать ad, та же проблема, аргумент равен нулю. Также я читал, что сопоставление маршрутов нечувствительно к регистру, поэтому это не должно быть проблемой.   -  person fluter    schedule 29.11.2017
comment
попробуйте переименовать arg в id. Но, исходя из вашего ответа, ваш путь правильный, и вы точно попадаете в метод контроллера API?   -  person Arno    schedule 29.11.2017
comment
Да, если я устанавливаю точку останова внутри функции, она попадает, просто arg имеет значение null.   -  person fluter    schedule 29.11.2017
comment
Будет ли работать, если вы перейдете на [HttpGet ({arg})]?   -  person Juri Pyykkö    schedule 29.11.2017
comment
Если ваш текущий Uri попадает в метод. тогда мой ответ должен сработать. За исключением, может быть, замены \{ID} на \{args}, который не совсем уверен в этом   -  person Arno    schedule 29.11.2017
comment
@ JuriPyykkö изменение на HttpGet ({arg}) не работает, в журнале написано No actions matched the current request. Route values: area=Ad, controller=Ad, action=Test, id=asdfasdf и возникает ошибка 404.   -  person fluter    schedule 29.11.2017


Ответы (1)


Если URI, показанный в исключении (http://localhost/api/Ad/Ad/Test/asdfasdf), позволяет вам ввести метод. Одно из этих двух решений должно работать:

1. Удалите /{id} из маршрута и измените Uri вашего запроса: http://localhost/api/Ad/Ad/Test?args=asdfasdf

2: либо переименуйте /{id} в маршруте тоже /{args}, либо переименуйте параметр вашего метода в ID.

person Arno    schedule 29.11.2017
comment
Хм, я думал, что параметры принимаются как позиционные аргументы, независимо от того, какое имя использует аргумент ... - person fluter; 29.11.2017
comment
По моему опыту не очень. вам либо нужно добавить множество шаблонов маршрутов, используйте [Route("{param1}/{pram2}")] на уровне метода. Или полностью удалите {/ID} и просто используйте ?param1=value&param2=value2 в конце вашего URI - person Arno; 29.11.2017