Возврат настраиваемого HttpResponseMessage как IActionResult - PullRequest
2 голосов
/ 27 мая 2020

У меня есть веб-api, который возвращает IActionResult.

Я возвращаю FileContentResult из этого api вот так

return new FileContentResult(model.Content, ContentType)
{
    EnableRangeProcessing = true
};

У меня есть требование, в котором я теперь хочу контролировать StatusCode я, а не FileContentResult решаю сам.

Я не нахожу никакого способа сделать это.

По сути, я хочу вернуть свой собственный HttpResponseMessage, в котором я могу сам устанавливать заголовки и другие вещи.

Но я не нахожу способа сделать это для типа IActionResult .

Единственное, что, как я думал, может сработать, - это использовать ResponseMessageResult что-то вроде этого

var content = new ByteArrayContent(bytesWithValidationData);
var response = new HttpResponseMessage();
response.Content = content;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.StatusCode = HttpStatusCode.PartialContent;
response.Content.Headers.ContentRange = new ContentRangeHeaderValue(from, to);

return new ResponseMessageResult(response);

Но его ответ не такой, как HttpResponse, он просто возвращает json результат с HttpResponseMessage подробные сведения об объекте, но фактически не возвращает Http-ответ, учитывая тип содержимого et c. где я могу скачать файл.

Это дает такой результат

enter image description here

Есть ли способ вернуть свой HTTP-ответ типа результата созданного файла?

1 Ответ

0 голосов
/ 27 мая 2020

Legacy ASP. NET Базовый веб-API имеет специальную обработку для необработанных экземпляров HttpResponseMessage. ASP. NET Core - нет - действие вашего контроллера должно возвращать экземпляр IActionResult.

В вашем случае я бы предложил создать подкласс FileContentResult и манипулировать код состояния, а затем возврат вашего подкласса из вашего контроллера. Примерно так:

public class MyFileContentResult : FileContentResult
{
    public override Task ExecuteResultAsync(ActionContext context)
    {
        var result = base.ExecuteResultAsync(context);

        context.HttpContext.Response.StatusCode = <your status code>;

        return result;
    }
}
...