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 ...
随机推荐
- 第二天-while循环 格式化输出 运算符 编码
一.while循环 while 条件: 语句块(循环体) #判断条件是否成立,若成立执行循环体,然后再次判断条件...直到不满足跳出循环 else: 当条件不成立的时候执行这里,和break没 ...
- USACO08MAR土地购买 与 APIO2010特别行动队
两道斜率优化DP: 土地购买 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的 ...
- Drupal网站报错:PDOException: in lock_may_be_available()
Drupal网站报错: 原因: windows中mysql的服务停止了: 解决办法: 在服务中,启动mysql服务 启动后,刷新页面,问题完美解决
- 微信开发 获取AccessToken
获取AccessToken的方法 public static Access_token GetAccessToken() { string formatString = String.Format(& ...
- 如何从只会 C++ 语法的水平到达完成项目编写软件的水平?
原文:https://www.zhihu.com/question/29702729 学习 C++ 有一段时间了,但只是停留在熟悉语法阶段,在看 C++primer,不过感觉这本书比较深奥,不太适合, ...
- spring cloud Eureka server配置
参考:http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html spring boot版本:2.0.3.RELEA ...
- Python学习---Django的基础操作180116
Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...
- 音乐mp4网站 汽车服务工程 张旭
- PTA | Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- [BZOJ 4010][HNOI 2015] 菜肴制作
4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1776 Solved: 889[Submit][Status ...