Как преобразовать эту конфигурацию маршрутизации из .net3.1 в .net5?

#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();
     });