Итак, я новичок в 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 нет ничего подобного?
Да, но это именно то, чего я не хочу. Когда у меня есть действие и параметр контроллера, тогда mvc должен знать, что делать, поскольку конфликта нет, верно?





Украсьте свой контроллер следующим образом:
[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 неужели нельзя?
Но вы используете атрибут Route вместо контроллера [Route("api/[controller]")]. Я не понимаю, как пропустить этот атрибут. Можете ли вы объяснить больше?
Да, но я использую его только один раз. Я не хочу указывать маршрут в каждом методе. им я все еще буду использовать его, пока не будет лучшего глобального решения. Например, WebApiConfig, который после этого удалит всю маршрутизацию
Чтобы имя действия было частью маршрута, вам нужно обновить атрибут [Route(..)], чтобы учесть действие. Вы уже используете токен [controller] в своем примере, поэтому просто добавьте [action]:
[Route("api/[controller]/[action]")]
См. документы для подробного объяснения замены токена.
Да, это было так, теперь все работает. Только один вопрос: если я удалю route attr, не следует ли использовать настройки, указанные в классе запуска, например app.UseMvc(routes =>, и сделать их глобальными настройками? почему доза не работает?
MapRoute устанавливает обычная маршрутизация, но [ApiController] требует маршрутизации атрибутов.
Удалите [ApiController] и часть Route, оттуда вы можете добавить атрибут Route к своим методам