控制器

抽象类Controller

Visual Studio的向导创建的Controller类型继承自抽象类Controller。

  1. 它是ControllerBase的子类。
  2. 实现了IController 和IAsyncController接口。支持同步和异步两种执行方式,默认采用异步。
  3. 实现了代表MVC 5种过滤器的接口。
  4. 实现了IAsyncManagerContainer接口,提供一个AsyncManager对象位异步操作的执行提供参数传递、操作计数和超时控制等功能。
  5. 实现了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 待续的更多相关文章

  1. 返璞归真 asp.net mvc (3) - Controller/Action

    原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...

  2. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  3. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  4. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  5. Asp.net MVC 中Controller返回值类型ActionResult

    [Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...

  6. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  7. 【部分】ASP.NET MVC的Controller接收输入详解

    原文:https://blog.csdn.net/lxrj2008/article/details/79455360 ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用 ...

  8. ASP.NET MVC控制器Controller中参数

    前述文章参见:ASP.NET MVC控制器Controller 绪论 之前的控制器返回的均为常量字符串,接下来展示如何获取请求传来的参数,而返回"动态"的字符串. 可以在操作方法B ...

  9. Asp.Net MVC中Controller、Action、View是如何激活调用的

    上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...

随机推荐

  1. 简单的学习心得:网易云课堂Android开发第四章服务、广播与酷特性

    1.Service (1)含义:Service是在后台长时间运行的应用组件,所在线程是main线程. (2)使用方式:startService能够执行onStartCommand中操作,bindSer ...

  2. Java中的常见面试题

    1.sleep()和wait()的区别: 两者都可以控制线性进程,阻塞进程.区别是: -----|sleep():释放CPU,不释放资源(锁).可以通过指定时间来使它自动醒来,时间不到只能调用iter ...

  3. 【代码笔记】iOS-获得徐家汇的天气预报

    一,代码. //获得徐家汇的天气预报 -(void)getWeatherInfo{ NSError *error; NSURLRequest *request = [NSURLRequest requ ...

  4. Linux - expect自动化远程登录脚本

    简单模式: #!/usr/bin/expect -f spawn ssh root@192.168.0.1 expect "*assword*" send "root\r ...

  5. fillStyle图片填充

    图片自找 <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas ...

  6. Java 理论与实践: 正确使用 Volatile 变量

    Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...

  7. [Erlang 0103] Erlang Resources 资讯小站

       好久没有写博客,是懒了吗?不是;前面两个月在紧张地推进一个项目,中间积累了一些RabbitMQ和Erlang的东西;本打算在项目结束之后赶紧总结一下,结果老婆怀孕之后生活节奏大乱:早起做饭,晚上 ...

  8. WPF中,Combox的SelectedItem属性绑定成功后,未能默认显示上一次选择的结果。

    问题描述: Combox中,设定了绑定对象,但是在第一次进入时却没有显示上次选中的项.      1)查看SelectedItem对应绑定的值,也是有的(启动时,读取上次设置的结果,来初始化界面). ...

  9. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  10. 设计模式C#实现(十四)——责任链模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...