ASP.NET Core Razor Pages如何传递文本/二进制数据?遇返回JSON异常
解决ASP.NET Core中返回HttpResponseMessage却得到JSON序列化结果的问题
兄弟,我太懂你现在的懵圈了——本来想让浏览器直接显示abcdefg字符串,结果返回的却是一堆HttpResponseMessage对象的JSON属性,这绝对是ASP.NET Core新手最容易踩的坑之一,咱们来把这个问题掰扯清楚!
问题根源
在老版本的ASP.NET Web API里,返回HttpResponseMessage是正常操作,框架会自动把它转换成对应的HTTP响应。但到了ASP.NET Core,情况变了:Controller基类不会再处理HttpResponseMessage类型的返回值,它会直接把这个对象序列化成JSON返回给客户端,这就是你看到那串奇怪JSON的原因。
解决方案:用ASP.NET Core原生的IActionResult返回类型
ASP.NET Core推荐使用IActionResult及其派生类来返回响应,框架会正确解析这些类型并生成对应的HTTP响应。
1. 先解决你当前的文本返回需求
把返回类型改成IActionResult,用Content()方法直接返回文本和指定MIME类型:
[Route("api/Mvc")] public class MvcController : Controller { public IActionResult Get(int imageid) { // 直接返回文本,指定Content-Type为text/plain return Content("abcdefg", "text/plain"); } }
2. 针对你最终的需求:返回数据库中的JPEG图片
你需要返回二进制图片数据并设置MIME为image/jpeg,用FileResult是最简洁的方式:
[Route("api/Mvc")] public class MvcController : Controller { // 模拟从数据库读取图片二进制数据的方法,替换成你的实际逻辑 private byte[] GetJpegFromDatabase(int imageId) { // 这里写你的数据库查询代码,返回图片的byte数组 return ...; } public IActionResult Get(int imageid) { byte[] jpegData = GetJpegFromDatabase(imageid); // 返回图片流,指定MIME类型为image/jpeg return File(jpegData, "image/jpeg"); } }
如果你的图片数据已经是Stream类型(比如从数据库读取到Stream),也可以直接传入Stream:
public IActionResult Get(int imageid) { // 假设从数据库获取到图片Stream Stream jpegStream = GetJpegStreamFromDatabase(imageid); return File(jpegStream, "image/jpeg"); }
总结一下
ASP.NET Core和老Web API的响应处理逻辑有很大区别,别再用老Web API的HttpResponseMessage那套了,改用IActionResult系列的返回类型(Content、File、Json等),框架会帮你搞定所有响应头和内容的处理,省心多了!
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

