#asp.net-mvc #asp.net-core #.net-5
Вопрос:
У меня есть api, работающий на локальном хосте:5001, в моем ASP.NET Приложение MVC Я смог это сделать:
routes.MapRoute(
name: "Default",
url: "{*stuff}",
defaults: new { controller = "Default", action = "DefaultAction" }
);
это означало, что я мог просто ввести localhost:5001/aRandomStuff в своем веб-браузере, и « aRandomStuff
» будет передано в качестве параметра в моем actionresult DefaultAction
внутри моего DefaultController
.
Какова эквивалентность выполнения такого рода маршрутизации в .net5 под
app.UseEndpoints(endpoints =>
{
//routing here
});
?
Ответ №1:
Вы можете использовать RouteAttribute
его непосредственно на своей конечной точке.
Просто сопоставьте свой контроллер по умолчанию в вашем Startup.cs
(если вам нужен контроллер по умолчанию):
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Затем в вашем контроллере добавьте Route
атрибут для нужного вам действия.:
[Route("{id}")]
public IActionResult DefaultAction(string id)
{
return View();
}
Так как только конечная точка имеет параметр {} маршрут, определенный в этом случае, а контроллер нет, вышеуказанная конечная точка будет запущена с localhost:5001/whateverString и whateverString будут отправлены в качестве значения параметра id
.
Мне нужно было отредактировать свой первоначальный ответ, так как он предназначался для конечных точек Api. Отредактированный ответ должен работать для вашего приложения MVC вместо этого.
Ответ №2:
Они внесли много обновлений в маршрутизацию в .Net 5, которые действительно повлияли на то, как мы воспринимаем универсальную маршрутизацию. Это было на самом деле намеренно и технически так, как они хотят, чтобы это работало. Тем не менее, это вызвало много путаницы со стороны POV у большинства из нас. Вы можете увидеть некоторые обсуждения и журналы ошибок здесь, здесь и здесь.
Я не смог заставить его работать с точками использования при запуске. Как показывает первая ссылка, порядок контроллеров для предшествования также мешает, и другие ответы здесь потенциально могут вызвать конфликты маршрутов или другую путаницу, для которой маршрут наиболее важен.
Я видел, что это работает только с атрибутами маршрута в контроллере, где мы устанавливаем порядок. Это означает, что вы знаете, что это будет последний проверенный шаблон:
[Route("{*url}", Order = 999)]
public IActionResult MyCatchAll(string url)
{
...
}
Таким образом, приоритетный порядок будет последним (я думаю, что большинство из них находятся в диапазоне 0-5, так что 999-это достаточно высокий показатель), а URL-адрес передается в качестве параметра, которым вы можете управлять по мере необходимости. И, честно говоря, я предпочитаю это, но вариант сделать то или другое было бы неплохо.
Если у кого — то есть способ сделать это в приложении.Используйте точки доступа, я бы хотел это увидеть, но все образцы выходят из строя или работают у меня только эпизодически.
Ответ №3:
Используйте Этот Шаблон в Своем Действии, Перехватывайте Все Запросы И Получайте Первое Значение Маршрута, Подобное Этому
[Route("/{**catchAll}")]
public IActionResult Index()
{
string randomQuery =HttpContext.Request.RouteValues["catchAll"]?.ToString();
return Content(randomQuery);
}
Ответ №4:
попробуйте это
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Default}/{action=DefaultAction}/{id?}");
});
[Route("{id}")]
[Route("~/{id}")]
public IActionResult DefaultAction(string id)
{
return View();
}
Ответ №5:
В следующем коде DefaultAction()
метод использует атрибут маршрута с регулярным выражением. Все URL-адреса в следующем формате localhost:port/SomeStringStuff
будут обработаны этим методом действия.
[ApiController]
[Route("[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
[Route(@"/{text:regex(.*Stuff$)}")]
public string DefaultAction(string text)
{
/// your code ...
return text;
}
}
Примите во внимание, что ASP.NET Базовая платформа добавляет RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant
в конструктор регулярных выражений.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});