MVC4 Action 方法的執行

1. ActionInvoker 的執行:

  在MVC 中 ?包括Model綁定與驗證在內的整個Action的執行是通過一個名為ActionInvoker的組件來完成的。 它同樣具有 同步/異步兩個版本。

? ? ?分別實現了接口 IActionInvoker /IAsyncActionInvoker。

? ? ?ASP.NET MVC 中真正用于Action方法同步和異步執行ActionInvoker 類型分別是 ContorllerActionInvoker /AsyncContollerActionInvoker.

? ? ?AsyncContollerActionInvoker 是?ContorllerActionInvoker ?的子類

? ? ?也就是說 當Action 沒有指定 ?實現?IActionInvoker /IAsyncActionInvoker 接口的時候 ?它默認是 執行AsyncContollerActionInvoker 的.

? ? 我們來看下面的代碼片段:

? ? 我們通過?Ninject 對?SyncActionInvoker 和?AsyncActionInvoker 進行接口的映射,然后創建一個?ActionInvoker?

? ? 其返回的結果分別是 ?各自的實例對象?AsyncContollerActionInvoker?SyncActionInvoker ?AsyncActionInvoker (這中間有一個前提需要進行 緩沖的清除 )

? ??

?

   public ActionResult Index(){return View(this.GetActionInvokers().ToArray());}public IEnumerable<IActionInvoker> GetActionInvokers(){//Current 代表的是當前DependencyResolver。NinjectDependencyResolver dependencyResolver = (NinjectDependencyResolver)DependencyResolver.Current;//1. 默認創建的ActionInvokeryield return this.CreateActionInvoker();//2. 為Dependency注冊針對IActionInvoker的類型映射 dependencyResolver.Register<IActionInvoker, SyncActionInvoker>();yield return this.CreateActionInvoker();//3. 為Dependency注冊針對IAsyncActionInvoker的類型映射dependencyResolver.Register<IAsyncActionInvoker, AsyncActionInvoker>();yield return this.CreateActionInvoker();}

? ?注意: 創建 ActionInvoker 的3個步驟

?   ?1.) 在創建?CreateActionInvoker 的時候 如果返回 不為null 則將其默認為ActionInvoker, 也就是如上代碼,(清除ActionInvoker緩存后) 它返回 ? ? ? ? ? ?    ? ? ?   ? ? ?AsyncContollerActionInvoker, 如果 返回null ?則進入 下一步驟。

?  2.) 創建 IActionInvoker ?規則同上

?  3.)創建?IAsyncActionInvoker?規則同上

?

?2. ControllerDescriptor 的同步/異步

  如果Controller使用ControllerActionInvoker ,它所有的Action總是以同步方式執行。

? ? ? 如果 Controller使用AsyncControllerActionInvoker 作為ActionInvoker時,卻并不意味這總是異步方式。

? ? ? 通過兩個描述對象?ControllerDescriptor ?和?ActionDescriptor?

? ? ? 在默認情況下?ReflectedControllerDescriptor ?是通過ControllerActionInvoker 來創建的。

? ? ? ReflectedAsyncControllerActionInvoker 是通過AsyncControllerActionInvoker ?來創建的。

? ? ? 看如下代碼 他們返回 返回的值 分別是對象類型的 ?ReflectedControllerDescriptor ? 和?ReflectedAsyncControllerActionInvoker 。

    public class SyncActionInvoker : ControllerActionInvoker{public new ControllerDescriptor GetControllerDescriptor(ControllerContext controllerContext){return base.GetControllerDescriptor(controllerContext);}}public class AsyncActionInvoker : AsyncControllerActionInvoker{public new ControllerDescriptor GetControllerDescriptor(ControllerContext controllerContext){return base.GetControllerDescriptor(controllerContext);}}

?

? ?3.ActionDescriptor的執行。

? ? ?Action 方法可以采用同步和異步執行方式,異步Action對應的ActionDescriptor 直接或者間接繼承自抽象類AsyncActionDescriptor,

? ? ?AsyncActionDescriptor 又是抽象類ActionDescriptor的子類。

? ? ?同步和異步的 Action 分別 調用 Execute 和 ?BeginExecute/EndExecute方法來完成

? ? ?AsyncActionDescriptor 重寫了Execute 會拋出異常,所以?AsyncActionDescriptor對象只能采用異步執行。

? ? 同步Action 通過ReflectedControllerDescriptor 對象描述。

? ? 異步Action 通過ReflectedAsyncControllerDescriptor ?對象描述。

? ? 返回Task的異步Action 則通過TaskAsyncControllerDescriptor 對象描述。

? ??

?

轉載于:https://www.cnblogs.com/dragon-L/p/5259917.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373490.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 基礎知識總結

要學好C#&#xff0c;基礎知識的重要性不言而喻&#xff0c;現將常用到的一些基礎進行總結&#xff0c;總結如下&#xff1a; 01. 數據類型轉換&#xff1a; 強制類型轉換(Chart--> int): char crA; int i (int)(cr); 02. 委托/匿名函數/Lamda表達式&#xff1a; 委托是匿…

Java注釋和真實世界的Spring示例

“注釋”是編程語言定義的一種&#xff0c;用作“標記”。 可以將它們視為編程語言引擎可以理解的注釋行。 它們不會直接影響程序的執行&#xff0c;但是會在需要時間接影響。 定義 注釋使用interface關鍵字定義&#xff0c;并且與接口相似。 它具有定義類似于接口方法的屬性。…

scrapy+mysql+pipeline+更新數據_python3+Scrapy爬蟲實戰(二)—— 使用pipeline數據保存到文本和數據庫(mysql)...

前言保存本地存儲Json數據配置setting保存數據庫創建數據庫創建表編寫pipelines配置setting本文是對上篇文章所講的代碼進一步優化&#xff0c;回看可以點這里&#xff0c;代碼就直接在上一篇代碼中進行改造&#xff0c;沒有的小伙伴可以在這里下載。前言Scrapy 提供了 pipelin…

NYOJ 44 子串和

子串和 時間限制&#xff1a;5000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述 給定一整型數列{a1,a2...,an}&#xff0c;找出連續非空子串{ax,ax1,...,ay}&#xff0c;使得該子序列的和最大&#xff0c;其中&#xff0c;1<x<y<n。 輸入 第一行是一個…

學習進度條

學習進度條 周次 學習時間 新編寫代碼行數 博客量&#xff08;篇&#xff09; 學到知識點 第一周 160 0 1 github的使用和認識軟件工程這門課的價值。 第二周 160 130 3 復利的計算和Github的一些簡單操作還有就是進行項目的開發分析&#xff0c;還有就是對…

ARM基礎

1.  將32位a的【7&#xff1a;4】改成0101 -> a a&(~(0xF << 4)) | (0x5 << 4)&#xff1b; 2.  32位&#xff1a;單次處理數據32位。 3.  對于CPU而言&#xff0c;一切皆內存&#xff1b; 4.  DMA總線&#xff1a;不經過CPU直接在內存和內存間交換…

使用Jolokia和JMX進行客戶端服務器監視

Java監視工具的選擇非常廣泛&#xff08;由Google提供的隨機選擇和順序&#xff09;&#xff1a; javamelody 壓力探頭 JVisualVM 控制臺 賈蒙 Java JMX Nagios插件不適用 此外&#xff0c;還有各種專用工具&#xff0c;例如ActiveMQ &#xff0c; JBoss &#xff0c; Qu…

圖書管理系統數據字典_2. 結構化——數據字典

返回目錄&#xff1a;Chilan Yuk&#xff1a;軟件工程分析設計圖庫目錄?zhuanlan.zhihu.com一、基本知識用于定義數據流和數據存儲的結構&#xff0c;并給出構成所給的數據流和數據存儲的各數據項的基本數據類型。數據字典中應該包括關于數據的如下信息一般信息&#xff08;名…

HDOJ 5184 Brackets 卡特蘭數擴展

既求從點(0,0)僅僅能向上或者向右而且不穿越yx到達點(a,b)有多少總走法... 有公式: C(ab,min(a,b))-C(ab,min(a,b)-1) /// 折紙法證明卡特蘭數: http://blog.sina.com.cn/s/blog_6917f47301010cno.html Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65…

010-python基礎-數據類型-字符串操作

1、移除空白 1 username.strip() 2、分割 1 names "alex,jack,rain" 2 names_1 names.split(",") #  字符串分割之后變成列表 3 print(names_1) 4 #輸出 5 [alex, jack, rain] 3、合并列表各元素成為字符串 1 names_1 [alex, jack, rain]2 names_2…

重復次數最多的 子串_每日算法系列【LeetCode 424】替換后的最長重復字符

題目描述給你一個僅由大寫英文字母組成的字符串&#xff0c;你可以將任意位置上的字符替換成另外的字符&#xff0c;總共可最多替換 k 次。在執行上述操作后&#xff0c;找到包含重復字母的最長子串的長度。示例1輸入&#xff1a; s "ABAB", k 2 輸出&#xff1a; …

python基礎(一)簡單入門

一.第一個python程序 1.交互式編程 直接在命令行里面輸入python即可進入python交互式命令行&#xff0c;linux下一樣&#xff1a; 在 python 提示符中輸入以下文本信息&#xff0c;然后按 Enter 鍵查看運行效果&#xff1a; 2.腳本式編程 把代碼都寫到文件里面&#xff0c;然后…

VS2015 python

http://pgqlife.info/2015/05/05/VS-Python/ 配置文檔轉載于:https://www.cnblogs.com/itdef/p/5262712.html

了解Java弱引用

我最近沒來得及關注該博客&#xff0c;最重要的是&#xff0c;我沒有為與技術界的所有人保持聯系而致歉。 我最近偶然發現了Java 1.2以來提供的java.lang.ref包&#xff0c;但具有諷刺意味的是&#xff0c;幾天前我才知道它。 在瀏覽了幾篇有關各種引用類型和java doc的文章時&…

unbuntu 啟動任務腳本_Ubuntu下服務啟動腳本編寫

像Nginx、MySQL等服務一樣&#xff0c;在后臺運行自己編寫的抓取天氣信息的Python腳本。1.以管理員權限新建一個服務腳本文件sudo vim /etc/init.d/weather_service2.用下列模板修改該服務腳本文件#!/bin/bash### BEGIN INIT INFO## Provides: weather_service# Required-Start…

iOS開發工具——網絡封包分析工具Charles

作者 唐巧 發布于 2013年12月9日 | 1 討論 分享到&#xff1a;微博微信FacebookTwitter有道云筆記郵件分享稍后閱讀我的閱讀清單簡介 Charles是在Mac下常用的截取網絡封包的工具&#xff0c;在做iOS開發時&#xff0c;我們為了調試與服務器端的網絡通訊協議&#xff0c;常常需要…

Java Web托管選項流程圖

我經常被問到的一個問題是在何處以及如何托管Java Web應用程序。 可以在帶有嵌入式服務器的Eclipse中創建它很好&#xff0c;但是如何將它帶給人們呢&#xff1f; 長期以來&#xff0c;對于發燒友的程序員一直沒有答案。 只有昂貴和超大型的選擇。 事情最近變了&#xff0c;但這…

查找出系統中大于50k 且小于100k 的文件并刪除。

查找出系統中大于50k 且小于100k 的文件并刪除。 [rootxusx xxx]# ll -lhtotal 624K-rw-r--r-- 1 root root 576K Nov 30 21:39 1.txt-rw-r--r-- 1 root root 48K Nov 30 21:40 2.txt [rootxusx xxx]# find ./ -type f -size 1k -a -size -100k ./2.txt 轉載于:https://www.cnb…

vb.net mysql存儲圖片_怎么讓VB.NET 上傳圖片到SQL 數據庫只保存路徑,圖片保存到文件...

我的前臺代碼dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.ConnectionCoonRsNewSqlClient.SqlCommand("上傳圖片",Coon)Rs.CommandTypeCommandType.StoredPr...我的前臺代碼 dim Coon As SqlClient.SqlConnection dim Rs As New SqlClient.Sql…

[國嵌攻略][132][串口驅動實現]

如何開發Linux驅動程序 一般情況下都會有現成的驅動程序&#xff0c;不需要從零開始開發驅動程序。所以Linux驅動開發主要分為兩個步驟&#xff1a;1.讀得懂驅動程序&#xff1b;2.寫的了核心功能。 發送中斷處理程序 發送中斷處理函數在/drivers/serial/samsung.c的s3c24xx_se…