ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让用户下载,那么在Controller的Action中用Response.Body这个Stream流,来逐步发送文件数据到客户端浏览器是最好的办法。
但是我今天在ASP.NET Core MVC的Controller的Action中使用Response.Body输出数据到客户端浏览器的时候遇到了个问题,我们来看看下面这个Controller:
using Microsoft.AspNetCore.Mvc;
using System.IO; namespace AspNetCoreActionFilter.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// 显示一个网页供测试
/// </summary>
public IActionResult Index()
{
return View();
} /// <summary>
/// 调用此Action,采用Response.Body的Stream流发送字符串数据到客户端浏览器
/// </summary>
/// <returns>返回一个IActionResult对象</returns>
public IActionResult WriteResponseWithReturn()
{
Response.ContentType = "text/html"; using (StreamWriter sw = new StreamWriter(Response.Body))
{
sw.Write("Write a string to response in WriteResponseWithReturn!");
} return null;
}
}
}
可以看到这个HomeController非常简单就两个Action:
- Index这个Action用于显示一个简单的网页做测试
- WriteResponseWithReturn这个Action采用Response.Body的Stream流发送字符串数据到客户端浏览器,其返回类型为IActionResult,但是我们实际上返回的是一个null
结果我在浏览器(IE浏览器)上输入Url地址"Home/WriteResponseWithReturn"返回的结果如下:

可以看到页面报错了,但是返回的Http状态码是200,表示Http响应又是成功的。。。总之来说HomeController的WriteResponseWithReturn这个Action执行出问题了,我们输出到Response.Body的Stream流中的文字,没能正确发送到客户端浏览器。
接着我修改了下HomeController的WriteResponseWithReturn这个Action,让其返回一个EmptyResult对象,如下所示:
using Microsoft.AspNetCore.Mvc;
using System.IO; namespace AspNetCoreActionFilter.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// 显示一个网页供测试
/// </summary>
public IActionResult Index()
{
return View();
} /// <summary>
/// 调用此Action,采用Response.Body的Stream流发送字符串数据到客户端浏览器
/// </summary>
/// <returns>返回一个IActionResult对象</returns>
public IActionResult WriteResponseWithReturn()
{
Response.ContentType = "text/html"; using (StreamWriter sw = new StreamWriter(Response.Body))
{
sw.Write("Write a string to response in WriteResponseWithReturn!");
} return new EmptyResult();
}
}
}
再尝试在浏览器上输入Url地址"Home/WriteResponseWithReturn",这次返回的结果如下:

这次浏览器成功将我们输出到Response.Body的Stream流中的文字显示出来了,而且返回的Http状态码也是200
接着我在HomeController中又定义了一个Action叫WriteResponseWithoutReturn,还是输出一段字符串数据到Response.Body的Stream流中,发送给客户端浏览器,但是WriteResponseWithoutReturn这个Action方法没有返回类型,返回类型为void,如下所示:
using Microsoft.AspNetCore.Mvc;
using System.IO; namespace AspNetCoreActionFilter.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// 显示一个网页供测试
/// </summary>
public IActionResult Index()
{
return View();
} /// <summary>
/// 调用此Action,采用Response.Body的Stream流发送字符串数据到客户端浏览器
/// </summary>
/// <returns>返回一个IActionResult对象</returns>
public IActionResult WriteResponseWithReturn()
{
Response.ContentType = "text/html"; using (StreamWriter sw = new StreamWriter(Response.Body))
{
sw.Write("Write a string to response in WriteResponseWithReturn!");
} return new EmptyResult();
} /// <summary>
/// 调用此Action,采用Response.Body的Stream流发送字符串数据到客户端浏览器
/// </summary>
public void WriteResponseWithoutReturn()
{
Response.ContentType = "text/html"; using (StreamWriter sw = new StreamWriter(Response.Body))
{
sw.Write("Write a string to response in WriteResponseWithoutReturn!");
}
}
}
}
然后我在客户端浏览器上输入Url地址"Home/WriteResponseWithoutReturn"来访问我们新加的这个Action方法,这次返回的结果如下:

可以看到如果Action返回的类型是void,那么输出到Response.Body的Stream流中的数据也可以成功发送到客户端浏览器。
小结:
所以当我们在ASP.NET Core MVC中Controller的Action中,要用Response.Body的Stream流输出数据到客户端时,有两种办法可以确保数据可以成功发送到客户端:
- 如果基于某种原因必须要将Action方法的返回类型定义为非void类型(例如我们本例中的WriteResponseWithReturn方法返回的就是IActionResult类型),切记不要返回null,要返回一个EmptyResult对象才能保证Response.Body的Stream流数据能成功发送到客户端浏览器上。
- 还有个办法就是将Action方法的返回类型定义为void(例如我们本例中的WriteResponseWithoutReturn方法),这样也可以安全地将Response.Body的Stream流数据发送到客户端浏览器上。
ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据的更多相关文章
- ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost
我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...
- ASP.NET Core MVC中URL和数据模型的匹配
Http GET方法 首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况. 我定义一个UserController ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中
我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...
- 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行
我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值
用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...
- 如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas
前言 软件系统中总是希望做到松耦合,项目的组织形式也是一样,本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离,并且对Areas进行支持. 实践 1.新 ...
- 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...
随机推荐
- python学习之老男孩python全栈第九期_day019作业
# 计算时间差 import time start_time = time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S' ...
- webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...
- 用一个div模拟textarea并实现高度自适应
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- sql按中文数字排序
有表4张 建表和插入数据sql DECLARE @p_Building TABLE ( id INT , BidName ) ); DECLARE @p_Room TABLE ( id INT , R ...
- 006Spring面向切面
01.基本术语---->POM中配置spring-aspects 1.通知(Advice)---->要做的事 前置通知(@Before) 后置通知(@After) 返回通知(@AfterR ...
- Spring Data MongoDB 查询指定字段
DBObject dbObject = new BasicDBObject(); //dbObject.put("name", "zhangsan"); //查 ...
- 1 win10双系统安装ubuntu16.04和18.04(问题详细记录)
我从来不想在琐事上花功夫.就拿装系统来说,我感觉拿过来一个完全陌生的项目源码,看起来,都比装系统爽.我属于典型的逻辑思考男.喜欢畅游程序的海洋. 一直windows跑深度学习和tensorflow,有 ...
- C#中Invoke的用法()-解决子线程访问主线程控件、线程安全等问题
引自https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概 ...
- UltraISO制作U盘启动盘教程
Step 1: 首先需要安装UltraISO,完成安装后打开软碟通,文件->打开,打开我们的iso镜像 安装包可以百度搜索 Step 2:然后选择我们的U盘 Step 3:然后点击启动-> ...
- RCLighting
RCLighting https://github.com/RidgeCorn/RCLighting 效果: 真机测试的效率: 看了源码,其实原理很简单: ====================== ...