控制器

抽象类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. [Erlang 0107] Erlang实现文本截断

       抽时间处理一下之前积压的一些笔记.前段时间有网友 @稻草人 问字符串截断的问题"各位大侠 erlang截取字符串一般用哪个函数啊",有人支招用string:substr/3, ...

  2. 记一次Linux服务器上查杀木马经历

    开篇前言 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux ...

  3. C、C++: 引用、指针、实例、内存模型、namespace

    // HelloWorld.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...

  4. 机器学习实战笔记(Python实现)-00-readme

    近期学习机器学习,找到一本不错的教材<机器学习实战>.特此做这份学习笔记,以供日后翻阅. 机器学习算法分为有监督学习和无监督学习.这本书前两部分介绍的是有监督学习,第三部分介绍的是无监督学 ...

  5. js,jq新增元素 ,on绑定事件无效

    在jquery1.7之后,建议使用on来绑定事件. $('.upload a').on('click',function(){ $(this).remove(); }) 在DOM渲染的时候,也就是ht ...

  6. 微信浏览器的HTTP_USER_AGENT

    在iPhone下,返回   1 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, lik ...

  7. 使用本地JConsole监控远程JVM(最权威的总结)

    问题背景   Tomcat经常崩溃crash,想看看JVM内存使用情况,就想到了用Jconsole监控,以前只是监控本地的JVM,这次要监控远程的,遇到了不少问题.   经过几个小时的努力,参考了众多 ...

  8. Ngnix下安装python2.7

    1 mkdir data 创建data目录 2 cd data 切换到data目录下 3 mkdir python27 创建python27目录 4 将下载好的python压缩包放在python27目 ...

  9. Makefile 编写 tips

    1.变量赋值 VARIABLE = value #在执行时扩展,允许递归扩展 VARIABLE := value #在定义时扩展 VARIABLE ?= value #只有在该变量为空时才设置该值 V ...

  10. win7如何恢复以前的ie版本

    如何恢复以前的ie版本-控制面板,程序和功能-查看已安装的更新-搜索Internet explorer,然后卸载更新就Ok.