Работает ли обычная маршрутизация ASP. NET WebAPI без указания действия и ограничений глагола HTTP? - PullRequest
0 голосов
/ 10 марта 2020

В нашем проекте classi c ASP. NET WebAPI мы могли бы объявить маршрут, и платформа выберет правильное действие на основе глагола HTTP в запросе.

Однако в. NET Базовый WebAPI, я попробовал следующую конфигурацию маршрута

app.UseEndpoints(endpoints =>
{
   endpoints.MapControllers();
   endpoints.MapControllerRoute(
      name: "DefaultRoute",
      pattern: "{controller}/{id?}"
   );
});

У моего контроллера есть один метод

public class WeatherForecastController : ControllerBase
{
   [HttpGet]
   public WeatherForecast Get()
   {
      //return weather forecast
   }
}

При попытке следующего URL-адреса я получаю 404, тогда как в аналогичном классе c ASP. NET Проект WebAPI будет автоматически выполнять метод Get.

https://localhost/weatherforecast

Означает ли это, что для обычной маршрутизации нам нужно добавить несколько маршрутов с одинаковым шаблоном, с действием по умолчанию и ограничениями метода HTTP, чтобы он работал правильно?

Этот вопрос касается только обычных маршрутизация, предлагая перейти к атрибутной маршрутизации, не является ответом.

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Означает ли это, что для обычной маршрутизации нам нужно добавить несколько маршрутов с одинаковым шаблоном, с действием по умолчанию и ограничениями метода HTTP, чтобы он работал правильно?

Да, в asp . net core web api, если вы хотите использовать обычную маршрутизацию, сначала необходимо удалить атрибут [ApiController] и атрибут [Route] и использовать следующий маршрут с действием по умолчанию

app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=WeatherForecast}/{action=Get}/{id?}");
    });

См. Обычная маршрутизация в ASP. NET Базовый API

Обновление: использование перезаписи URL

Вы всегда можете написать свои собственные правила перезаписи URL в удовлетворить ваши требования. Ниже приведена демонстрационная программа, в которой рассматривается URL, например /weatherforecast:

Создание правил перезаписи:

public class RewriteRuleTest : IRule
    {
        public void ApplyRule(RewriteContext context)
        {
            var request = context.HttpContext.Request;
            var path = request.Path.Value;// path= "/weatherforecast" for example

            if(path !=null)
            {
                context.HttpContext.Request.Path = path + "/" + request.Method; 
                // "/weatherforecast/post"
            }
        }
    }

Startup.cs

app.UseRewriter(new RewriteOptions().Add(new RewriteRuleTest()));
app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapControllerRoute(
        name: "GetRoute",
        pattern: "{controller=WeatherForecast}/{action=Get}/{id?}"
    );
});
0 голосов
/ 12 марта 2020

Я нашел вопрос, который пытается смоделировать это поведение в classi c ASP. NET WebAPI в ASP. NET Core: Действие маршрута на основе глагола HTTP?

Пример находится в. NET Core 2 и MVC, но пробует его в. NET Core 3 WebAPI работает так же.

Кажется, что ответ Нет, в ASP. NET Базовый WebAPI, если у маршрута нет действия в шаблоне маршрута и нет ограничений метода HTTP, платформа не будет автоматически пытаться сопоставить действия, основанные на глаголе HTTP в запросах. Для этого необходимо добавить несколько маршрутов с действиями по умолчанию и ограничениями глаголов.

0 голосов
/ 10 марта 2020

Маршрутизация отвечает за сопоставление URL-адреса запроса с конечной точкой, и она поставляется с двумя типами маршрутизации Обычная и Атрибуты.

И, исходя из вашего вопроса, вы ожидаете обычной маршрутизации с маршрутизацией по умолчанию, которой вы можете достичь. NET CORE с использованием приведенной ниже строки кода.

app.UseMvc(routes =>
{
    routes.MapRoute("default", "{controller=Search}/{action}/{id?}");
});

Примечание: Но имейте в виду, что конвективная маршрутизация не будет работать, если вы украсите свой контроллер атрибутом [ApiController].

По умолчанию. NET CORE поддерживает маршрутизацию атрибутов, поэтому вы должны поставить префикс маршрута, поместив атрибут [Route] на уровень контроллера. Ниже приведен пример

    [Route("api/[controller]")]
    [ApiController]
    public class SearchController : ControllerBase
    {

        [HttpGet("{company}")]
        public IActionResult Get(string company) 
        {
            return Ok($"company: {company}");
        }

        [HttpGet("{country}/{program}")]
        public IActionResult Get(string country, string program) 
        {
            return Ok($"country: {country} program: {program}");
        }
    }

Приведенный выше код будет работать так, как вы ожидаете (маршрутизация атрибутов).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...