Есть ли встроенная функция / метод для возврата, IActionResult / ActionResult вместо HttpResponseMessage в. Net Core 3.1 - PullRequest
0 голосов
/ 26 апреля 2020

Метод My Action возвращает HttpResponseMessage , но я хочу избавиться от Microsoft.AspNetCore. Mvc .WebApiCompatShim Пакет NuGet (который в основном предоставляется для преодоления разрыва при перенос Asp. Net кода веб-API в. Net Core) и использование IActionResult / ActionResult вместо HttpResponseMessage .

Мой метод действия выглядит следующим образом это:

    [HttpGet]
    [Route("GetTemplate")]
    public async Task<HttpResponseMessage> GetTemplate(string id) {
        var userAgent = this.Request.Headers.UserAgent;
        bool IsWindows = true;
        if(userAgent.ToString().ToLower().Contains("apple")) {
            IsWindows = false; //false
        }
        var template = await _templateService.GetTemplateContent(id);
        HttpResponseMessage responseMsg = new HttpResponseMessage();
        if(IsWindows) {
            responseMsg.Content = new StringContent(JsonConvert.SerializeObject(template));
            responseMsg.RequestMessage = Request;
            responseMsg.StatusCode = HttpStatusCode.OK;
            responseMsg.Content.Headers.ContentType =
                new MediaTypeHeaderValue("application/json");
        } else {
            responseMsg.Content = new ByteArrayContent(template.ContentBytes);
            responseMsg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileNameStar = template.Name };
            responseMsg.Content.Headers.Add("x-filename", template.Name);
            responseMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            responseMsg.Content.Headers.ContentLength = template.ContentBytes.Length;
            responseMsg.RequestMessage = Request;
            responseMsg.StatusCode = HttpStatusCode.OK;
        }
        return (responseMsg);
    }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

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

[HttpGet]
[Route("GetTemplate")]
public async Task<HttpResponseMessage> GetTemplate(string id)
{
    var userAgent = this.Request.Headers.UserAgent;
    bool IsWindows = !userAgent.ToString().ToLower().Contains("apple");

    var template = await _templateService.GetTemplateContent(id);
    if (IsWindows)
    {
        return Json(template);
    }
    else
    {
        Response.Headers.Add("x-filename", template.Name);
        return File(template.ContentBytes, "application/octet-stream", template.Name);
    }
}

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

0 голосов
/ 26 апреля 2020

Сначала измените подпись вашего действия следующим образом:

public async Task<IActionResult> GetTemplate

Затем вы вернете свои данные в ответ примерно так: return Ok(data). Вам не нужно сериализовать ваши данные, вы можете отправить класс POCO. Это будет представлять .StatusCode = HttpStatusCode.OK

Если вы хотите добавить дополнительные заголовки к своему ответу, вы сделаете это, используя поле Response из ControllerBase. Например. Response.Headers.Add для добавления пар ключ-значение в заголовок ответа.

...