Asp.Net MVC<六>:Controller、Action 待续
控制器
抽象类Controller
Visual Studio的向导创建的Controller类型继承自抽象类Controller。
- 它是ControllerBase的子类。
- 实现了IController 和IAsyncController接口。支持同步和异步两种执行方式,默认采用异步。
- 实现了代表MVC 5种过滤器的接口。
- 实现了IAsyncManagerContainer接口,提供一个AsyncManager对象位异步操作的执行提供参数传递、操作计数和超时控制等功能。
- 实现了IDisposable接口,使得Controller激活系统在Controller执行结束后可以完成相应的资源回收工作。
public abstract class Controller : ControllerBase,
IActionFilter,
IAuthenticationFilter,
IAuthorizationFilter,
IExceptionFilter,
IResultFilter, IDisposable, IAsyncController,
IController,
IAsyncManagerContainer
{
//……
}
ControllerBase
TempData仅仅用于存储临时数据,并且设置的变量在第一次被读取后就会被移除。
ViewData和ViewBag时同一份数据的不同表现形式,后者是一个动态对象。
public abstract class ControllerBase : IController
{
protected ControllerBase(); public ControllerContext ControllerContext { get; set; } public TempDataDictionary TempData { get; set; } public bool ValidateRequest { get; set; } public IValueProvider ValueProvider { get; set; } public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } protected virtual void Execute(RequestContext requestContext); protected abstract void ExecuteCore(); protected virtual void Initialize(RequestContext requestContext);
}
同步执行Or异步执行
ASP.NET是基于线程池来处理请求的。如果请求处理操作耗时较短,那么工作线程处理完毕后可以及时地被释放到线程池中以用于对下一个请求的处理。但是对于比较耗时的操作来说,意味着工作线程将被长时间被某个请求独占,如果这样的操作访问比较频繁,在高并发的情况下意味着线程池中将可能找不到空闲的工作线程用于及时处理最新抵达请求。
如果我们采用异步的方式来处理这样的耗时请求,工作线程可以让后台线程来接手,自己可以及时地被释放到线程池中用于进行后续请求的处理,从而提高了整个服务器的吞吐能力。值得一提的是,异步操作主要用于I/O绑定操作(比如数据库访问和远程服务调用等),而非CPU绑定操作,因为异步操作对整体性能的提升来源于:当I/O设备在处理某个任务的时候,CPU可以释放出来处理另一个任务。如果耗时操作主要依赖于本机CPU的运算,采用异步方法反而会因为线程调度和线程上下文的切换而影响整体的性能。
Controller的异步执行
IController接口中的Execute方法是以同步的方式执行的,而IAsyncController接口则提供了异步执行的方式。
public interface IAsyncController : IController
{ IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state); void EndExecute(IAsyncResult asyncResult);
}
Controller类型具有一个布尔类型的属性DisableAsyncSupport,默认情况下总是返回False,即支持以异步方式执行Controller。
而由于Controller类型实现了IAsyncController接口,所以Controller的执行总是通过调用BeginExecute/EndExecute方法以异步方式来执行。属性DisableAsyncSupport则决定BeginExecute方法内部是以同步还是异步的方式调用Execute/BeginExecuteCore方法。
public abstract class Controller:……
{
//…… protected virtual bool DisableAsyncSupport { get { return false; } } protected virtual IAsyncResult BeginExecute(RequestContext requestContext
, AsyncCallback callback, object state)
{
if (this.DisableAsyncSupport)
{
//通过调用Execute方法同步执行Controller
}
else
{
//通过调用BeginExecuteCore/EndExecuteCore方法异步执行Controller
}
}
}
Action的异步执行
URL:http://localhost:61771/test/Article, 读取文件并返回内容。
MVC4.0 之前,通过AsyncController类型实现异步执行。
public class TestController : AsyncController
{
public void ArticleAsync(string name)
{
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(() =>
{
string path = string.Format(@"\articles\{0}.html", name);
path = ControllerContext.HttpContext.Server.MapPath(path);
using (StreamReader reader = new StreamReader(path))
{
AsyncManager.Parameters["content"] = reader.ReadToEnd();
}
AsyncManager.OutstandingOperations.Decrement();
});
}
public ActionResult ArticleCompleted(string content)
{
return Content(content);
}
}
在MVC4.0后 提供了新的异步Action方法定义方式
public class TestController : Controller
{
public Task<ActionResult> Article(string name)
{
string path = string.Format(@"\articles\{0}.html", name);
path = ControllerContext.HttpContext.Server.MapPath(path);
StreamReader reader = new StreamReader(path); return reader.ReadToEndAsync().ContinueWith<ActionResult>(task =>
{
reader.Close();
return Content(task.Result);
});
}
}
另一个版本
public async Task<ActionResult> Article(string name)
{
string path = string.Format(@"\articles\{0}.html", name);
path = ControllerContext.HttpContext.Server.MapPath(path);
using (StreamReader reader = new StreamReader(path))
{
return Content(await reader.ReadToEndAsync());
}
}
Asp.Net MVC<六>:Controller、Action 待续的更多相关文章
- 返璞归真 asp.net mvc (3) - Controller/Action
原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...
- Asp.net MVC 中Controller返回值类型ActionResult
[Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...
- ASP.NET MVC中controller和view相互传值的方式
ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...
- 【部分】ASP.NET MVC的Controller接收输入详解
原文:https://blog.csdn.net/lxrj2008/article/details/79455360 ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用 ...
- ASP.NET MVC控制器Controller中参数
前述文章参见:ASP.NET MVC控制器Controller 绪论 之前的控制器返回的均为常量字符串,接下来展示如何获取请求传来的参数,而返回"动态"的字符串. 可以在操作方法B ...
- Asp.Net MVC中Controller、Action、View是如何激活调用的
上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...
随机推荐
- JAVA模板方法设计模式(从现实生活角度理解代码原理)
概述: 定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现. 实现该模式的关键步骤: 第一步:抽象类,实现模板方法,定义功能(确定 ...
- Activity详解一 配置、启动和关闭activity
先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...
- Android屏幕适配
安卓分辨率的相关知识 http://leoray.leanote.com/post/android-resolution Android内存占用公式 系统内存 = 像素宽 * 像素高 * 像素所占用的 ...
- 【产品 & 设计】入门 - 工具篇 - Sketch + Skala Preview
前言 做产品和设计快 1 年了,积累了一点经验分享一下 —— 抛砖引玉,欢迎交流. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: ht ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- 项目管理过程组和知识领域表(PMBOK2008)
项目管理过程组和知识领域表(PMBOK2008) 知识领域 项目管理过程组 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 4. 项目整合管理 4.1 制定项目章程 4.2 制定项目管理 ...
- Linux 客户端访问 NFS报Permission Denied错误
在Linux服务器上访问NFS共享目录时,报错:Permission denied. 如下截图所示: 因为这个NFS是系统管理员配置的,我又不了解具体情况,而系统管理员休假中,联系不上.那么我只能先多 ...
- SQL Server 2008 master 数据库损坏解决总结
SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s ...
- 为什么忘记commit也会造成select查询的性能问题
今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据,但是耗费了几分钟的时间.让我检查分析一下原因,分析解决过后 ...
- 通过重构VO实现校验功能
现有个需求,需要添加供应商的页面校验功能,当填写一二级时,供应商是必填项,并且所填的供应商必须是二级分类下的,否则下一步和保存过不去: 解决方案: 1.在页面AM的XXXImpl.java中, 加入引 ...