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中都进行了一次包装

 

posted @ 2017-12-12 19:25  西伯利亚的狼  阅读(582)  评论(0编辑  收藏  举报