Смешивание MVC и API в одном контроллере - PullRequest
0 голосов
/ 03 октября 2019

У меня есть проект ASP.NET Core MVC, когда я внедряю и пробую с другим человеком, сайт зависает и время ожидания.

Когда мы начали проект, мы создали контроллер MVC, и все работало нормально. Затем нам потребовалось несколько источников данных для фронта, и мы включили методы «API» (обратите внимание на кавычки) в тот же контроллер MVC. И тогда начинают появляться проблемы.

Недавно мы развернули проект в производстве, я попросил кого-нибудь помочь мне протестировать и найти ошибки. Мы подключаемся, и когда мы загружаем домашнюю страницу, JS API вызывает тайм-аут. Сначала я подозревал, что сервисные вызовы выполняются веб-бэкендом, но после некоторой отладки дело не в этом.

Нечеткая вещь локальная (и одна), все работает без нареканий. Поэтому мне нужно было углубиться в тестирование, я попросил другого тестировщика загрузить дом одновременно со мной, с другой стороны, я запускаю Postman для вызова конечной точки «API» веб-сайта. Представление отрисовывается идеально, и JS вызывает API и время ожидания истекает через 15 секунд, а в Postman запрос никогда не находит ответа.

Заключение и время для вопросов: я обнаружил, что вызовы API кажутся заблокированными, когда несколько соединенийиспользовать контроллер. После нескольких поисков в Google я обнаружил, что в ASP.NET Core 2.x MVC и API не расширяют один и тот же базовый код, MVC расширяет Controller, потому что он поддерживает Views, а API расширяет ControllerBase, который аналогичен Controller без поддержки Views. И многие люди говорят, что контроллеры MVC и API должны быть двумя разными контроллерами.

Но это не решает мою основную проблему, почему вызовы API в контроллере MVC прерываются, когда веб-сайт используют более одного пользователя? И почему контроллер MVC не может обрабатывать конечные точки API? Это из-за представлений?

Надеюсь, я ясно дал понять, потому что мне хотелось бы получить ответ, кроме того, чтобы применить то, что говорят люди (и документацию, я думаю).

Править: здесь пример того, что это сейчас

public FooController : Controller 
{
    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }

    [HttpGet]
    public IActionResult GetData()
    {
        return StatusCode(200, new { value = 1 });
    }
}

Индекс отображается правильно и время ожидания вызова https://example.com/Foo/GetData или никогда не находите ответ, когда более чем один пользователь использует сайт.

Конфигурация маршрута:

applicationBuilder.UseMvc(routes =>
{
    routes.MapRoute(name: "cultureRoute",
        template: "{culture}/{controller}/{action}/{id?}",
        defaults: new { controller = "Logon", action = "Index" },
        constraints: new
        {
            culture = new RegexRouteConstraint("^[a-z]{2}(?:-[A-Z]{2})?$")
        });

        routes.MapRoute(name: "default", template: "/{controller=Logon}/{action=Index}/{id?}");
});

1 день спустя, я обнаружил причину проблемы, мы используем SignalR для синхронизации данных между пользователями, по неизвестной причине, когда я отключаю SignalR, все работает на любом подключенном пользователе,Итак, как SignalR может блокировать все запросы к API в определенный момент?

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