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); }
这是一个抽象类,主要是为了继承用。
构造函数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作用
返回值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中都进行了一次包装