首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在HttpResponseMessage内核3.1中是否有任何内置函数/方法可以返回,IActionResult/ActionResult而不是.Net

在HttpResponseMessage内核3.1中是否有任何内置函数/方法可以返回,IActionResult/ActionResult而不是.Net
EN

Stack Overflow用户
提问于 2020-04-26 05:08:20
回答 2查看 525关注 0票数 0

我的操作方法是返回HttpResponseMessage,但是,我想摆脱Microsoft.AspNetCore.Mvc.WebApiCompatShim NuGet包(这基本上是为了在将Asp.Net Web代码移植到.Net Core时弥补差距而提供的),使用IActionResult/ActionResult而不是HttpResponseMessage.

我的操作方法如下所示:

代码语言:javascript
运行
复制
    [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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-26 09:21:02

因为您在这里没有做任何花哨的事情,所以可以在这里直接将返回对象转换成相应的操作结果。在您的示例中,您需要一个JsonResult和一个具有自定义响应头的FileResult

代码语言:javascript
运行
复制
[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);
    }
}

ControllerControllerBase类型上有许多类似的实用程序方法,它们帮助您创建各种不同的响应消息。对于大多数用例,应该有一种内置的方式来生成响应。

票数 0
EN

Stack Overflow用户

发布于 2020-04-26 05:40:22

1将您的行为的签名更改为:

代码语言:javascript
运行
复制
public async Task<IActionResult> GetTemplate

然后,您将在响应中返回数据,类似于这个return Ok(data)。您不必序列化您的数据,您可以发送一个POCO类。这将表示.StatusCode = HttpStatusCode.OK

如果您想要向响应中添加额外的标题,可以使用来自ResponseControllerBase字段来实现。例如:Response.Headers.Add,用于向响应头添加键值对。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61436078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档