ASP.NET请求过程-视图如何返回客户端
本文主要讲控制器返回ActionResult后怎么变成html到客户端的。
控制器返回的各种类型
返回所有类型的基类ActionResult
//
// 摘要:
// 表示操作方法的结果。
public abstract class ActionResult
{
//
// 摘要:
// 初始化 System.Web.Mvc.ActionResult 类的新实例。
protected ActionResult(); //
// 摘要:
// 通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。
//
// 参数:
// context:
// 用于执行结果的上下文。上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。
public abstract void ExecuteResult(ControllerContext context);
}
ActionResult定义
这是一个抽象类,主要是为了继承用。
构造函数protected ActionResult(); 限定了权限
public abstract void ExecuteResult(ControllerContext context); 如何处理返回结果
返回值ViewResult对应控制器方法View(...)
ViewResult定义:表示一个类,该类用于使用由 System.Web.Mvc.IViewEngine 对象返回的 System.Web.Mvc.IView 实例来呈现视图。
就是说使用视图引擎(razor视图引擎 默认的,也可以自己定义)创建一个IView的对象,然后 用这个对象去渲染我们的视图(.cshtml),也就是替换视图中的后台代码。
继承方式:
public class ViewResult : ViewResultBase
public abstract class ViewResultBase : ActionResult
代码执行过程:
ExcuteResult这个方法是在ViewResultBase 中重写的。

mvc中也可以使用webform的视图引擎定义规则如下 其实都是定义好的,在代码里面写好的(路由用 controller action 名词,先匹配到的就返回,视图文件位置等等),所以说约定大于配置。

razor的视图引擎定义规则


RunViewStartPages作用

ViewEngineResult详解
返回值PartialViewResult对应控制其方法PartialView()
定义:表示一个用于将分部视图发送到响应的基类。
继承:
public class PartialViewResult : ViewResultBase
public abstract class ViewResultBase : ActionResult
其实他和ViewResult差不多,唯一的区别的就是在PartialViewResult类中的protected override ViewEngineResult FindView(ControllerContext context)方法不同


这个缺少了布局页的指定。感叹一下,设计强大呀。
返回值JsonResult对应控制其方法JSON()
定义:表示一个类,该类用于将 JSON 格式的内容发送到响应。
继承:
public class JsonResult : ActionResult
这个比较简单只有一层继承。

代码比较简单
FileContentResult
返回值FileStreamResult对应控制其方法File(。。。)
file()根据参数不同,返回的result类型也不同
以FileStreamResult为例
protected internal FileStreamResult File(Stream fileStream, string contentType);
定义:使用 System.IO.Stream 实例将二进制内容发送到响应。
继承:
public class FileStreamResult : FileResult
public abstract class FileResult : ActionResult
代码调用:

以FileContentResult为例
protected internal FileContentResultFile(byte[] fileContents, string contentType);
定义:将二进制文件的内容发送到响应。
继承:
public class FileContentResult : FileResult
public abstract class FileResult : ActionResult
代码调用:

其实文件类的都一样,都是要写成二进制,然后放入输出流
其他的还有HttpNotFoundResult,JavaScriptResult,RedirectResult,RedirectToRouteResult,EmptyResult等各种Result
这里都不在一一解释了。其实都是把数据写入输出流
其中EmptyResult,什么也没有干。

如果返回字符串,就不会调用ExecuteResult,直接把信息写入到HttpContext中,Response.ContentType 为"application/text"
其实也可以返回Void,只用把数据写入输出流(Response.Write或者.OutputStream.Write),在设置内容格式Response.ContentType。
action方法

或者自己定义Result

反射调用Action后,自动执行返回Result的ExecuteResult
上节内容(ASP.NET请求过程-从源码角度研究MVC路由、Handler、控制器)讲到在MvcHandler中通过反射最后会调用action。这个是调用action的具体方法。在方法中还用调用 返回结果ActionResult的ExecuteResult方法。
1,MvcHandler中调用InvokeAction

2、 InvokeAction具体执行过程,最后执行了ActionResult.ExecuteResult
图片有点大,可以把浏览器网页方法一点 (Ctrl + 页面放大)(Ctrl - 页面缩小)(Ctrl 0 页面还原)

ASP.NET五大对象
Request
请求相关的信息,
QueryString:请求链接后买拼接的参数
Form:表单中的参数。
File:上传的文件
Response
返回相关的信息
Server
他是一个工具型的类,里面一个帮助方法
字符编码等

Application
不要认为他是HttpApplication,他只存在一个,是一个全局变量,注意加锁,所有的用户都是操作他。他的类型为HttpApplicationStateBase
在控制器中获取的方法:HttpContext.Application

(上面的四个对象 没有什么好写的 推荐文章http://blog.csdn.net/aojiancc2/article/details/19075103)
Cookie Session
首先HTTP协议是一个无状态的。就是第一次请求和第二次请求是没有联系的。
web1.0的时候,网页只是可以展示一些东西,用户也只能被动的接受东西。
他们是为了客户端和服务器可持续交互(简单的说就是用户登录了,让服务器和客户端持续知道他在登录)
Cookie存在客户端浏览器配置的一个文件夹下面的一个文本中。服务器设置了Cookie(增,删,该),浏览器的接受 就会有一个设置Cookie。

。
Session存在服务器中。服务器保存一个Session,浏览器会保存一个对应的Cookie记录对应的SessionID。一次回话只有一个SessionID。(这样就把每一个用户存的session区分开)


浏览器的每次请求都会自动带上cookie的。
cookie和session的沟通就是通过sessionid这个cookie来得。
ASP.NET程序中 当一个浏览器第一次打一个页面,Session这个module(SessionStateModule)会检查请求的内容里面有没有cookie,没有的话就生成一个sessionid(不过现在session是空的),并且执行session_start,然后返回的时候就把sessionid放进cookie中给浏览器。)。如果访问的过程中,强行清空cookie,那么就会在生成一个sessionid。
五大对象以及Httpcontext 在asp.net mvc中都进行了一次包装
ASP.NET请求过程-视图如何返回客户端的更多相关文章
- ASP.NET请求过程-从源码角度研究MVC路由、Handler、控制器
路由常用对象 RouteBase 用作表示 ASP.NET 路由的所有类的基类. 就是路由的一个基础抽象类. // // 摘要: // 用作表示 ASP.NET 路由的所有类的基类. [ ...
- ASP.NET请求过程-Module
管道模型 上图中为Http请求在Asp.net程序中处理的过程.管道处理模型来自上面的HttpApplication,管道处理模型其实就是多个Module(其实这些module都是在往http ...
- ASP.NET请求过程-基本过程
客户端发送请求到达服务器 输入域名->DNS解析->指定IP 服务器(如果网页直接输入IP地址则直接到服务器)->请求到达服务器->HTTP.SYS接受HTTP请求->转 ...
- ASP.NET请求过程-Handler
什么事Handler asp.net程序所有的请求都是handler处理的.以前的webform我们访问的地址是xxxxx.aspx地址,其实他也会到一个handler(我们写的业务代码都在handl ...
- spring mvc请求过程
spring mvc处理请求过程 1. 首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...
- ASP.Net请求小周期
另一篇另篇2 ASP.NET请求处理全过程 一个ASP.NET请求过程中,从浏览器中发出一个Web请求 到 这个请求被响应并显示在浏览器中的过程中究竟会发生哪些不同的事件,当我们进入这个事件之旅时,我 ...
- TCP面试题之HTTP和HTTPS的请求过程
HTTP的请求过程: 1.TCP建立连接后,客户端会发送报文给服务端: 2.服务端接收报文并作出响应: 3.客户端收到响应后解析给用户: HTTPS的请求过程: 1.客户端发送请求到服务端: 2.服务 ...
- Asp.Net请求响应过程
Asp.Net请求响应过程 在之前,我们写了自己的Asp.Net框架,对整个流程有了一个大概的认识.这次我们来看一下Asp.Net整个请求处理过程是怎么样的. 浏览器封装请求报文,发送请求到达服务器, ...
- http请求在asp.net中的请求过程
当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会 ...
随机推荐
- java sqlite docker,sqlite出错
1问题1 使用docker镜像部署springboot程序,sqlite出错,在windows和linux环境都没有问题,使用docker部署就报错 Caused by: java.lang.Unsa ...
- MySQL之级联删除、级联更新、级联置空
1. 准备测试表 # 专业表major ))engine=innodb default charset=utf8; # 学生表mstudent ), major int)engine=innodb d ...
- struts的带参数结果集
action在forward过程中共享一个值栈,也就是一次request只有一个值栈,服务器端的forward对于客户端来说就是一次request,在forward过程就没必要再传参数了. 总结也就是 ...
- 和小哥哥一起刷洛谷(5) 图论之深度优先搜索DFS
关于dfs dfs伪代码: void dfs(s){ for(int i=0;i<s的出度;i++){ if(used[i]为真) continue; used[i]=1; dfs(i); } ...
- 利用iterm2,在命令行预览图片,服务器也是可以的
1.首先你本地电脑上要安装iterm2软件,我们这里使用brew安装 这个是一定要装的,因为能在命令行渲染出图片文件全靠它,其实不是服务器渲染出来的,而是iterm2 官方网站:https://www ...
- 深度学习面试题10:二维卷积(Full卷积、Same卷积、Valid卷积、带深度的二维卷积)
目录 二维Full卷积 二维Same卷积 二维Valid卷积 三种卷积类型的关系 具备深度的二维卷积 具备深度的张量与多个卷积核的卷积 参考资料 二维卷积的原理和一维卷积类似,也有full卷积.sam ...
- C# Area 双重路由
在WebApi项目里面 一般除了接口, 还有管理端...一些乱七八糟的,你想展示的东西, 一种做法是分开写: 比如管理后台一个项目, 然后接口一个, 然后页面一个, 其实这样做也可以,但是这么做, 无 ...
- python清理docker-harbor的多余镜像
# coding: utf-8 from operator import itemgetter from urllib import parse import requests import date ...
- System.Net.WebRequestMethods.cs
ylbtech-System.Net.WebRequestMethods.cs 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutr ...
- [转]地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系
转自:http://www.rivermap.cn/docs/show-1829.html 常用坐标系详解 (一)WGS84坐标系 WGS-84坐标系(World Geodetic System一19 ...