当您从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" });
}
我的猜测是,返回字符串的函数在后面的内容中执行类似的操作,就像我在第一个代码片段函数中所做的那样,但是我不确定。
答案 0 :(得分:2)
没有太大区别。但实际上你应该避免使用它作为锅炉板并且没有充分利用ASP.NET Core MVC工具。
最好使用IActionResult
作为返回类型,并使用辅助方法(Ok
,BadRequest
,NotFound
,File
等)或直接创建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“不支持的媒体类型”。