MVC API не попадает в контроллер - PullRequest
0 голосов
/ 07 октября 2019

Я перевожу некоторые внутренние проекты с NET Core 2.0 на 3.0, и у меня возникают проблемы с выполнением контроллера после завершения промежуточного программного обеспечения. Честно говоря, я немного разочарован тем, что похожий подход используется для работы с NET Core 2.0.

Я загрузил свой тестовый проект в GitHub: https://github.com/wonea/MVC-API-Routing-Test

В тестовом проекте подробно описаны три промежуточных ПОэтапы;SecurityMiddleware, UserValidatorMiddleware, WebSocketMiddleware. Таким образом, при загрузке API вы можете установить точки останова на каждом из отдельных этапов, и они будут отображаться в правильном порядке. Однако после передачи HTTPContext на заключительном этапе промежуточного программного обеспечения он возвращается, но не попадает в контроллер.

В Startup.cs я настраиваю свои службы:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddApplicationInsightsTelemetry(_configuration);

    // memory cache
    services.AddMemoryCache();
    services.AddMvc()
    .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            options.JsonSerializerOptions.IgnoreNullValues = true;
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    // CORS
    var corsBuilder = new CorsPolicyBuilder();

    services.AddCors(builder =>
    {
        corsBuilder.AllowAnyHeader();
        corsBuilder.AllowAnyMethod();
        corsBuilder.AllowAnyOrigin();
        corsBuilder.WithOrigins("*");
        corsBuilder.AllowCredentials();
    });
}

Я подробно описал конвейер запросов, настройка WebSockets, выполнение промежуточного программного обеспечения, а затем запуск моего контроллера в качестве конечной точки.

public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime)
{
    appLifetime.ApplicationStarted.Register(OnStarted);
    appLifetime.ApplicationStopping.Register(OnStopping);
    appLifetime.ApplicationStopped.Register(OnStopped);

    Console.CancelKeyPress += (sender, eventArgs) =>
    {
        appLifetime.StopApplication();
        // Don't terminate the process immediately, wait for the Main thread to exit gracefully.
        eventArgs.Cancel = true;
    };

    app.UseRouting();
    app.UseSecurityMiddleware();
    app.UseUserValidation();

    // websockets
    var webSocketOptions = new WebSocketOptions
    {
        KeepAliveInterval = TimeSpan.FromSeconds(120)
    };
    app.UseWebSockets(webSocketOptions);
    app.UseWebSocketMiddleware();

    // put last so header configs like CORS or Cookies etc can fire
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Мне понадобится только один контроллер, поэтому мне не нужна какая-либо необычная конфигурация.

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Я вижу, что ваш контроллер настроен как

[Route("api/[controller]")]
public class MainController : Controller
{
    [HttpGet]
    public string Get()

Обратите внимание на документы скажем

Замените [controller] именем контроллера, котороеусловно имя класса контроллера минус суффикс "Controller".

Например, у меня есть контроллер "Work", который выглядит как

[Route("api/Work")]
[ApiController]
public class WorkController : ControllerBase
{

(он также имеетApiController атрибут).

После этого можно получить доступ по адресу httpx: // localhost / api / Work

Затем можно указать другие конечные точки в API с параметром HttpGetили HttpPost атрибут.

[HttpGet("Test")]
public async Task<ActionResult<string>> Test()
{

Будет httpx: // localhost / api / Work / Test

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

Разобрался, моя маршрутизация была ошибочной.

Мои настройки запуска были направлены прямо на расположение контроллеров

launchSettings.json

Тогда мой контроллер дублировал маршрутизацию. Итак, основной контроллер был разрешен на.

localhost: 51234 / api / main / api / main

enter image description here

У меня естьтеперь упорядочена маршрутизация главного контроллера

New Main Controller

...