Возврат данных из WEB API в приложении Blazor - PullRequest
2 голосов
/ 02 августа 2020

Рассмотрим следующие два фрагмента кода. Оба возвращают данные в вызов Get Web API. Оба возвращают список элементов. Оба работают. Первый был взят из начального приложения Blazor Wasm для Visual Studio. Второй был взят из онлайн-руководства. tblTitles - это таблица в удаленной базе данных, доступ к которой осуществляется через _dataContext.

Какие из них следует использовать и почему? Или, возможно, что-то лучше подходит для конкретной ситуации c?

    [HttpGet]
    //First method:
    public IEnumerable<TitlesTable> Get()
    {
        var titles =  _dataContext.tblTitles.ToList();
        return titles;
    }

    //Second method:
    public async Task<IActionResult> Get()
    {
        var titles = await _dataContext.tblTitles.ToListAsync();
        return Ok(titles);
    }

Ответы [ 3 ]

4 голосов
/ 02 августа 2020

Я полагаю, вы заметили различные доступные типы возвращаемых значений контроллера . На этой странице документации:

ASP. NET Core предлагает следующие параметры для типов возврата действий контроллера веб-API:

  • Specifi c type
  • IActionResult
  • ActionResult<T>

На странице предлагается рассмотреть, когда использовать каждый.

2 голосов
/ 02 августа 2020

Между вашими сниппетами есть 2 отличия, их стоит рассматривать отдельно.

1. Syn c или Asyn c

Большинство действий выполняют некоторые операции ввода-вывода, и шаблоны async / await намного предпочтительнее для обработки этого, это позволит вашему серверу обрабатывать гораздо больше одновременных запросов.

2. Обычные данные или IActionResult

Прямое возвращение данных - это запрос ASP. NET обернуть их в ответ для вас. Это легко, но как только вы попытаетесь добавить проверки, это станет проблемой c. Любая ошибка будет возвращена как статус 500 (внутренняя ошибка сервера), хорошо спроектированный API должен иметь возможность возвращать 400 (неверный запрос) или 404 (не найден), если применимо.

Итак, в заключение, async Task<IActionResult> или async Task<ActionResult<T>> - лучшие шаблоны для действия контроллера.

Первый был взят из стартового приложения Blazor Wasm для Visual Studio.

Нет, это не так. Демо-контроллер генерирует некоторые погодные данные, но не выполняет никаких операций ввода-вывода.

Что делает выбранную короткую форму приемлемой, но считает ее имеющей «демонстрационный» уровень качества.

2 голосов
/ 02 августа 2020

Оба одинаковые. По умолчанию asp. net обрабатывает методы действия как HttpGet, если атрибут не указан. Теперь оба возвращают список, но вы также должны рассмотреть возможность возврата указанного c кода статуса как части вашего api. Таким образом, клиентское приложение может понять, что произошло с запросом

IMHO, я буду go с этим подходом для вашего api

[HttpGet]
 public async Task<IActionResult> Get()
 {
    var titles = await _dataContext.tblTitles.ToListAsync();
    return Ok(titles);
 }

Вы можете вернуть конкретный c тип вместо IActionResult, который является общим представлением c, но вы увидите преимущество этого только тогда, когда вам нужно сгенерировать документацию для вашего api с использованием открытого стандарта api. Такие пакеты, как swashbuckle, проверяют тип возвращаемого значения путем отражения для создания правильной модели вывода в документации. Надеюсь, это поможет

...