本文主要讲控制器返回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请求过程-视图如何返回客户端的更多相关文章

  1. ASP.NET请求过程-从源码角度研究MVC路由、Handler、控制器

    路由常用对象 RouteBase 用作表示 ASP.NET 路由的所有类的基类.        就是路由的一个基础抽象类. // // 摘要: // 用作表示 ASP.NET 路由的所有类的基类. [ ...

  2. ASP.NET请求过程-Module

    管道模型     上图中为Http请求在Asp.net程序中处理的过程.管道处理模型来自上面的HttpApplication,管道处理模型其实就是多个Module(其实这些module都是在往http ...

  3. ASP.NET请求过程-基本过程

    客户端发送请求到达服务器 输入域名->DNS解析->指定IP 服务器(如果网页直接输入IP地址则直接到服务器)->请求到达服务器->HTTP.SYS接受HTTP请求->转 ...

  4. ASP.NET请求过程-Handler

    什么事Handler asp.net程序所有的请求都是handler处理的.以前的webform我们访问的地址是xxxxx.aspx地址,其实他也会到一个handler(我们写的业务代码都在handl ...

  5. spring mvc请求过程

    spring mvc处理请求过程 1.    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给Dispatch ...

  6. ASP.Net请求小周期

    另一篇另篇2 ASP.NET请求处理全过程 一个ASP.NET请求过程中,从浏览器中发出一个Web请求 到 这个请求被响应并显示在浏览器中的过程中究竟会发生哪些不同的事件,当我们进入这个事件之旅时,我 ...

  7. TCP面试题之HTTP和HTTPS的请求过程

    HTTP的请求过程: 1.TCP建立连接后,客户端会发送报文给服务端: 2.服务端接收报文并作出响应: 3.客户端收到响应后解析给用户: HTTPS的请求过程: 1.客户端发送请求到服务端: 2.服务 ...

  8. Asp.Net请求响应过程

    Asp.Net请求响应过程 在之前,我们写了自己的Asp.Net框架,对整个流程有了一个大概的认识.这次我们来看一下Asp.Net整个请求处理过程是怎么样的. 浏览器封装请求报文,发送请求到达服务器, ...

  9. http请求在asp.net中的请求过程

    当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会 ...

随机推荐

  1. Pytest权威教程27-Bash自动补全设置

    目录 Bash自动补全设置 返回: Pytest权威教程 Bash自动补全设置 在Linux/Mac bash shell环境下,可以使用argcomplete对pytest命令进行自动补全.首先要安 ...

  2. Consul常用接口使用

    prometheus.yml 配置 - job_name: 'node_exporter' consul_sd_configs: - server: 'consul_ip:8500' services ...

  3. SSH如何使用

    如何查看SSH服务是否已经安装? 在终端命令行执行 rpm -qa | grep "ssh" 执行结果请看下图,说明已经安装:其实在安装linux操作系统的时候默认就会安装上的. ...

  4. java中nextLine()与next()的区别

    java中的next()和nextLine()还是有很大区别的. next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自 ...

  5. Binder 原理剖析***

    一. 前言 希望更加深入理解 Binder 实现机制的,可以阅读文末的参考资料以及相关源码. 二. Binder 概述 简单介绍下什么是 Binder.Binder 是一种进程间通信机制,基于开源的 ...

  6. ogr ogr2ogr 矢量数据格式转换 ogrinfo 矢量数据图层信息操作 ogr gdal的一部分 gdal 命令行 库操作

  7. Python Django使用HttpResponse返回图片并显示

    views.py def read_img(request): """ : 读取图片 :param request: :return: """ ...

  8. SQLServer系统视图sysobjects中type字段说明

    SQLServer中系统视图sysobjects中type字段的对象类型: AF = 聚合函数 (CLR) C = CHECK 约束 D = DEFAULT(约束或独立) F = FOREIGN KE ...

  9. Jupyter Notebook in a virtual environment (virtualenv)

    $ python -m venv projectname $ source projectname/bin/activate (venv) $ pip install ipykernel (venv) ...

  10. SeetaFace2 cmake VS2015编译编译

    cmake Selecting Windows SDK version 10.0.17134.0 to target Windows 10.0.18362. == BUILD_VERSION: v2. ...