【问题标题】:Is there any in-built function/method to return, IActionResult/ActionResult instead of HttpResponseMessage in .Net Core 3.1.Net Core 3.1 中是否有任何内置函数/方法可以返回,IActionResult/ActionResult 而不是 HttpResponseMessage
【发布时间】:2020-04-26 05:08:20
【问题描述】:

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

我的 Action 方法如下所示:

    [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);
    }

【问题讨论】:

    标签: asp.net-core asp.net-web-api .net-core asp.net-core-mvc asp.net-core-webapi


    【解决方案1】:

    由于您没有在那里做任何花哨的事情,您可以在此处将返回对象直接转换为相应的操作结果。在您的情况下,您需要一个 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);
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      首先将您的操作签名更改为:

      public async Task<IActionResult> GetTemplate
      

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

      如果您想在响应中添加额外的标头,您可以使用 ControllerBase 中的 Response 字段。例如。 Response.Headers.Add 用于将键值对添加到您的响应标头。

      【讨论】:

        猜你喜欢
        • 2019-06-05
        • 1970-01-01
        • 2019-01-09
        • 2021-04-15
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多