在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流输出数据的更多相关文章

  1. ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

    我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...

  2. ASP.NET Core MVC中URL和数据模型的匹配

    Http GET方法 首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况. 我定义一个UserController ...

  3. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  4. 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

  5. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  6. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  7. ASP.NET Core MVC 中的 [Controller] 和 [NonController]

    前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...

  8. 如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas

    前言 软件系统中总是希望做到松耦合,项目的组织形式也是一样,本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离,并且对Areas进行支持. 实践 1.新 ...

  9. 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 ...

随机推荐

  1. 标签设置为inline-block后,如何消除标签之间的间隔。

    标签设置为inline-block后,如何消除标签之间的间隔. 例如: <div> <ul> <li><a href="#">学习& ...

  2. [HNOI2006]最短母串问题

    题目大意:给定一个字符串集,求一个最短字串,使得该集合内的串都是该串的一个子串 算法:AC自动机+最短路+状压DP 注意空间限制 #include"cstdio" #include ...

  3. Dinic算法----最大流常用算法之一

    ——没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...

  4. ps入门教程:photoshop工作界面

    请大家安装好PS(这不是废话嘛……),然后将PS的界面熟悉一下,消除对PS的惧怕心理~~学会新建文件和保存文件,学会设置参考线. 安装完毕后,打开PS,就进入了PS的操作界面,我们来看一下[图1.1] ...

  5. Java设计模式—代理模式

    代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下:     为其他对象提供一种代理以控制对这个对象的访问. 个人理解:        代理模式将原类进行封装, ...

  6. WPF使用样式更新ArcGis InfoWindow外观代码

    <Style x:Key="mainInfoWindowStyleMF" TargetType="{x:Type esri:InfoWindow}"> ...

  7. C# 后台添加Log信息

    我们在做项目的时候,经常会使用到Log日志,今天分享一下如何在后台添加Log信息 创建一个写Log的方法: public void WriteLog(string Action) { try { st ...

  8. Java 设计模式(三)-单例模式(Singleton Pattern)

    1     概念定义 1.1   定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2   类型 创建类模式 1.3   难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...

  9. 轻松应对IDC机房带宽突然暴涨问题

    轻松应对IDC机房带宽突然暴涨问题! 1[提出问题] [实际案例一] 凌晨3:00点某公司(网站业务)的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M,如下图: 该故障的影响:直接导致 ...

  10. is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c:严格输入了匹配通配符,但还是找不到元素“jee:jndi-lookup”的声明。

    由于未添加xsd声明引起