控制器

抽象类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. Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”

    Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ” 解决方法: 今天在电脑上安装了WIR ...

  2. Ruby的模型关系随笔

    1 Class和Module的实例方法也就是所有具体类和具体Module的类方法,因为具体类和具体Module分别是Class和Module的实例.例如Object.new对应着Class#new,K ...

  3. SQL Server 2012 安装图解教程

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB 安装SQL Se ...

  4. ORACLE数据库汉字占几个字节问题

    一同事由于系统需求关系,将SQL SERVER数据库的一个表导入ORACLE数据库时,发现居然报错:ORA-12899: value too large for column xxxx (actual ...

  5. WPF 自定义进度条

    WPF设计界面过程中,有时需要设计一种可以手动滑动修改并实时显示的进度条 进度条,效果如下: 颜色.图标.节点什么的,都可以重新替换. 前端XAML代码: <UserControl x:Clas ...

  6. OOM killer

    Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 1. 为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行m ...

  7. android开发之onCreate( )方法详解

    这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static,normal: ...

  8. stm32 hid 键盘描述

    /* USB Standard Device Descriptor */ const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DES ...

  9. Tomcat关闭日志catalina.out

    catalina.out文件会越来越大,对系统的稳定造成了一定的影响.conf/logging.properties 一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统 ...

  10. HTTPS----安全超文本传输协议

    HTTPS协议详解HTTPS以保密为目标研发,简单讲是HTTP的安全版.其安全基础是SSL协议,因此加密的详细内容请看SSL.全称Hypertext Transfer Protocol over Se ...