Маршрутизация конечной точки ASP.NET Core 3.0 не работает для маршрута по умолчанию - PullRequest
0 голосов
/ 21 октября 2019

Я перенес существующий проект API с 2.2 на 3.0 на основе рекомендаций с этой страницы .

Таким образом, я удалил:

app.UseMvc(options =>
{
    options.MapRoute("Default", "{controller=Default}/{action=Index}/{id?}");
});

и вставлено:

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

Но никакой контроллер и действие не будут связаны. Все, что я получаю для любого API, который я вызываю, это 404.

Как мне отладить его и что мне здесь не хватает?

Обновление: Файл Startup.cs находитсяв другой сборке. Мы повторно используем централизованный файл Startup.cs во многих проектах.

1 Ответ

1 голос
/ 22 октября 2019

С Маршрутизация атрибутов и обычная маршрутизация :

Обычно используются обычные маршруты для контроллеров, обслуживающих страницы HTML для браузеров, и маршрутизация атрибутов для контроллеров, обслуживающих API-интерфейсы REST.

С Создание веб-API с помощью ASP.NET Core: требование маршрутизации атрибута :

Атрибут [ApiController] делает требование маршрутизации атрибута обязательным. Например:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

Действия недоступны по обычным маршрутам, определенным UseEndpoints, UseMvc или UseMvcWithDefaultRoute в Startup.Configure.

Если вы хотите использовать обычные маршрутыдля веб-API необходимо отключить атрибуты маршрута на веб-API.

Запуск:

   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.MapControllerRoute(
                name: "Default",
                pattern: "{controller=default}/{action=Index}/{id?}");
        });
    }

Контроллер веб-API:

 //[Route("api/[controller]")]
//[ApiController]
public class DefaultController : ControllerBase
{
    public  ActionResult<string> Index()
    {
        return "value";
    }

    //[HttpGet("{id}")]
    public ActionResult<int> GetById(int id)
    {
        return id;
    }
}

Это может быть запрошено http://localhost:44888/default/getbyid/123

...