Добавление контроллера API в базовый проект ASP. NET. - PullRequest
1 голос
/ 13 марта 2020

Здесь находятся леса и отредактированы контроллеры.

namespace TheAspNetCoreProject
{
    [Route("api/TheApi")]
    [ApiController]
    public class TheApiController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetInfo()
        {
            return Ok("Foo");
        }
    }
}

Я надеялся увидеть его на /api/TheApi/ или /api/TheApi/Info или /api/TheApi/GetInfo, но ничего.

леса не сделали ничего не делать с Startup.cs, однако, например, в документах не упоминается, что в Startup.cs что-либо нужно, что звучит маловероятно.

Как мне заставить это работать

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Я только что запустил VS и создал новый. net базовый проект Web Api из шаблона, и он работает так, как вы ожидаете:

[ApiController]
[Route("api/TheApi")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
    [HttpGet("OtherGet")]
    public IEnumerable<WeatherForecast> OtherGet()
    {
        var rng = new Random();
        return Enumerable.Range(1, 2).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

Допустимые URL:

Startup.cs выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

ОБНОВЛЕНИЕ: Также имейте в виду, что вы не можете использовать несколько методов GET / POST et c в одном контроллере, только если вы используете аннотацию для других (или для всех них), как я сделал с OtherGet: HttpGet ("OtherGet")]. Если вы не используете эту аннотацию и имеете несколько методов GET, POST et c, у вас будет исключение: AmbiguousMatchException: The request matched multiple endpoints.

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

После многих очень неприятных проб и ошибок я могу теперь сообщить, что это действительно было Startup.cs, которое нужно было обновить - подмостки контроллера webAPI не обновили его.

В моем

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)

У меня было

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });

, и его нужно было изменить на

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers(); // Added for webAPI.
            });
0 голосов
/ 14 марта 2020

По умолчанию маршруты веб-API определены следующим образом: api/{controller}. Обратите внимание, что {action} нет.

Они являются таким образом, чтобы соответствовать способу REST (передача состояния представления). Он основан на понятии ресурсов и глаголов, которые применяются к ним; обычно GET, UPDATE, POST, DELETE.

Таким образом, с маршрутом по умолчанию это будет соответствовать:

GET api/TheApi

namespace TheAspNetCoreProject
{
    [Route("api/TheApi")]
    [ApiController]
    public class TheApiController : ControllerBase
    {
        public IActionResult Get()
        {
            return Ok("Foo");
        }
    }
}

Конечно, маршрут всегда может быть быть измененным, чтобы быть более похожим на RP C.

...