MVC APIController с пользовательскими именами

Итак, я новичок в netcoreapp и пытаюсь преобразовать свой старый API отдыха в новый.

Проблема в том, что у меня возникают проблемы с использованием имени и параметров пользовательских методов.

Я хочу иметь только [HttpGet] или [HttpPost], а затем действие и параметр.

Так например

[HttpGet]
public List<string> GetStrings(string firstString, string lastString){
 // my code here
}

а потом я пытаюсь вызвать это, что вообще не работает

baseUrl/controller/GetStrings?firstString=test&lastString=test2

Смотрите мой контроллер ниже, чтобы понять мою проблему

[ApiController]
[Route("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

}

Я пытался вызвать поиск таким образом, но безуспешно.

https://localhost:44330/Youtube.Manager.Core.API/api/Youtube/Search?searchString=Eminem&pageSize=20&relatedTo=&videoSearchType=Videos

И это моя конфигурация маршрутизации

  app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "api/{controller=Home}/{action=Index}/{id?}"
                );
        });

Есть ли какая-либо другая конфигурация, которую мне нужно иметь, а также, пожалуйста, я не хочу слишком указывать что-либо в моем атрибуте [HttpGet].

В сетевой структуре у меня было WebApiConfig, что могло бы справиться с такими операциями. В netcoreapp нет ничего подобного?

Удалите [ApiController] и часть Route, оттуда вы можете добавить атрибут Route к своим методам

traveler3468 25.06.2019 08:47

Да, но это именно то, чего я не хочу. Когда у меня есть действие и параметр контроллера, тогда mvc должен знать, что делать, поскольку конфликта нет, верно?

Alen.Toma 25.06.2019 08:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Украсьте свой контроллер следующим образом:

[ApiController]
[RoutePrefix("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost, Route("GetVideoAsync")]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet, Route("Playlist")]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet, Route("Search/{searchString}/{pageSize}/{relatedTo}/{videoSearchType}")]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

И добавьте следующую строку в ваш RouteConfig:

routes.MapMvcAttributeRoutes();

app.UseMvc(routes=> `routes.MapMvcAttributeRoutes();` доза не существует. У меня нет другой конфигурации. Где я должен это разместить. И я действительно хотел бы пропустить использование атрибута Route, как в старые добрые времена при использовании WebApiConfig неужели нельзя?

Alen.Toma 25.06.2019 08:53

Но вы используете атрибут Route вместо контроллера [Route("api/[controller]")]. Я не понимаю, как пропустить этот атрибут. Можете ли вы объяснить больше?

Sahil Sharma 25.06.2019 09:01

Да, но я использую его только один раз. Я не хочу указывать маршрут в каждом методе. им я все еще буду использовать его, пока не будет лучшего глобального решения. Например, WebApiConfig, который после этого удалит всю маршрутизацию

Alen.Toma 25.06.2019 09:07
Ответ принят как подходящий

Чтобы имя действия было частью маршрута, вам нужно обновить атрибут [Route(..)], чтобы учесть действие. Вы уже используете токен [controller] в своем примере, поэтому просто добавьте [action]:

[Route("api/[controller]/[action]")]

См. документы для подробного объяснения замены токена.

Да, это было так, теперь все работает. Только один вопрос: если я удалю route attr, не следует ли использовать настройки, указанные в классе запуска, например app.UseMvc(routes =>, и сделать их глобальными настройками? почему доза не работает?

Alen.Toma 25.06.2019 12:52
MapRoute устанавливает обычная маршрутизация, но [ApiController] требует маршрутизации атрибутов.
Kirk Larkin 25.06.2019 13:00

Другие вопросы по теме