Body.Write和字符串返回之间有什么区别吗?

时间:2017-03-18 11:56:41

标签: c# asp.net-core

当您从asp .net核心控制器返回响应时,您可以通过两种方式返回数据(可能会有更多但我只关注这两种方式)。我的问题是这两种方法之间的区别是什么(如果有的话);返回一个值vs直接写入正文?

    [HttpGet("Fetch_Write")]
    public void Fetch_Write()
    {
        HttpContext.Response.ContentType = "application/json";
        var s = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { data = "my_fetched_data" }));
        HttpContext.Response.Body.Write(s, 0, s.Length);
    }

在上面的方法中,函数的返回类型为void,我将内容直接写入响应主体,但我函数下面的版本返回一个字符串。当使用邮递员时,我从两个api调用得到相同的响应,两者之间有区别吗?我应该使用一个吗?

    [HttpGet("Fetch_Return")]
    public string Fetch_Return() 
    {
        HttpContext.Response.ContentType = "application/json";
        return JsonConvert.SerializeObject(new { data = "my_fetched_data" });
    }

我的猜测是,返回字符串的函数在后面的内容中执行类似的操作,就像我在第一个代码片段函数中所做的那样,但是我不确定。

1 个答案:

答案 0 :(得分:2)

没有太大区别。但实际上你应该避免使用它作为锅炉板并且没有充分利用ASP.NET Core MVC工具。

最好使用IActionResult作为返回类型,并使用辅助方法(OkBadRequestNotFoundFile等)或直接创建OkObjectResult / OkResult类并返回它们。这允许您设置状态代码并让ASP.NET Core选择正确的格式化程序(XML或json,甚至可能是OData,protobuf甚至自定义格式化程序),这取决于调用者的接受标题。

例如:

[HttpGet("Fetch_Return")]
[Produces("application/json"),Produces("application/xml")]
public string Fetch_Return() 
{
    return Ok(new { data = "my_fetched_data" });
}

[Produces("application/json"),Produces("application/xml")]只允许XML和json格式化。因此,如果用户使用Accept: application/xml调用此操作,他将收到一个xml文件,如果他使用Accept: application/json进行调用。如果您请求application/text,浏览器将返回Http Code 415“不支持的媒体类型”。