Что вернуть для строго типизированного результата, включая ошибки в HttpGet? ActionResult <T>, где T - FileContentResult, не работает - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь вернуть изображение и в некоторых случаях коды ошибок. Сначала я попытался вернуть Task<FileContentResult>, который работает, когда мне есть что вернуть. Но если я хочу, например, return BadRequest(), я получаю ошибку компилятора

Не могу неявно преобразовать тип 'Microsoft.AspNetCore.Mvc.BadRequestObjectResult' в 'Microsoft.AspNetCore.Mvc.FileContentResult'

Чтобы исправить это, я возвращаю ActionResult вместо этого. И это работает. Но он как бы принимает все. Я хочу быть ясным о том, что я хочу вернуть. Есть ли способ использовать строго типизированный ActionResult<T> или что-то подобное, чтобы сработал возврат любого из File (для успеха 200) и BadRequest, NotFound и т. Д.?

    [HttpGet("path")]
    [Produces("image/jpeg", "image/webp", "text/plain")]
    public async Task<ActionResult<FileContentResult>> Get(/*parameters*/)
    {
        if(/*invalid parameters*/)
        {
           return BadRequest("invalid parameters");
        }
        Byte[] image = GetImage();
        return File(image, "image/jpeg");
    }

Ответы [ 3 ]

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

Ответ - нет. Параметр универсального типа для ActionResult<T> предназначен для сериализуемого типа. По сути, он будет возвращать ObjectResult и, следовательно, может обрабатывать другие типы результатов, такие как BadRequestObjectResult и т. Д. Однако FileContentResult не наследуется от ObjectResult и не является сериализуемым типом. Поэтому его здесь нельзя использовать.

Если вы возвращаете файл и вам нужно иметь возможность возвращать другие результаты кода состояния, тогда все, что вы можете использовать, это IActionResult, что, очевидно, разрешит любойвозможный тип результата.

Атрибут ProducesResponseType можно использовать для документирования, но он никак не повлияет на фактический тип возвращаемого значения.

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

Я бы сгенерировал исключение HTTPRequestException и установил бы код ответа http, который имеет для вас наибольшее значение.

Если бы я был другим разработчиком, смотрящим на ваш код, для меня было бы разумно видеть FileContentResult как конкретныйвведите, а затем также сгенерируйте исключение HTTPRequestException для недопустимых параметров.

[HttpGet("path")]
[Produces("image/jpeg", "image/webp", "text/plain")]
public async Task<ActionResult<FileContentResult>> Get(/*parameters*/)
{
    if(/*invalid parameters*/)
    {
       throw new HttpResponseException(/* invalid parameters message */, HttpStatusCode.BadRequest)
    }
    Byte[] image = GetImage();
    return File(image, "image/jpeg");
}

Соглашение также важно для меня, и я думаю, что выполнение этого способа является соглашением, которое я видел в нескольких кодовых базах.

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

Вы должны использовать IActionResult

        [HttpGet("path")]
        [Produces("image/jpeg", "image/webp", "text/plain")]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        public async Task<IActionResult> Get(/*parameters*/)
        {
            if(/*invalid parameters*/)
            {
               return BadRequest("invalid parameters");
            }
            Byte[] image = GetImage();
            return File(image, "image/jpeg");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...