精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為ASP.NET MVC擴展異步Action功能(下)

開發 后端
異步請求處理是ASP.NET 2.0中引入的高級特性,它依托IO Complete Port,對于提高IO密集型應用程序的吞吐量非常重要。但是目前ASP.NET MVC框架缺少異步Action功能。本文作者給出了不錯的擴展:完整,方便,并且非常輕巧——核心邏輯代碼只有200行左右,這意味著絕大部分功能將會委托給框架中現成的內容,確保了擴展的穩定,高效并且擁有較好的向后兼容性。

編輯推薦:為ASP.NET MVC擴展異步Action功能(上)

執行Action方法

對于執行同步Action的SyncMvcHandler,其實現十分簡單而直接:

public class SyncMvcHandler : IHttpHandler, IRequiresSessionState
{
    public SyncMvcHandler(
        IController controller,
        IControllerFactory controllerFactory,
        RequestContext requestContext)
    {
        this.Controller = controller;
        this.ControllerFactory = controllerFactory;
        this.RequestContext = requestContext;
    }

 

    public IController Controller { get; private set; }
    public RequestContext RequestContext { get; private set; }
    public IControllerFactory ControllerFactory { get; private set; }

 

    public virtual bool IsReusable { get { return false; } }

    public virtual void ProcessRequest(HttpContext context)
    {
        try
        {
            this.Controller.Execute(this.RequestContext);
        }
        finally
        {
            this.ControllerFactory.ReleaseController(this.Controller);
        }
    }
}

而對于異步Action,我之前一直思考著怎么將框架的默認實現,也就是單個方法調用,轉化成兩個方法(BeginXxx/EndXxx)調用。曾經我想過自己實現一個新的ActionInvoker,但是這就涉及到了大量的工作,尤其是如果希望保持框架現有的功能(ActionFilter,ActionSelector等等),最省力的方法可能就是繼承ControllerActionInvoker,并設法使用框架已經實現的各種輔助方法。但是在分析了框架代碼之后我發現復用也非常困難,舉例來說,ControllerActionInvoker判定一個方法為Action的依據之一是這個方法返回的是ActionResult類型或其子類,這意味著我無法直接使用這個方法來獲取一個返回IAsyncResult的BeginXxx方法;同理,對于查找EndXxx方法,我可能需要在請求名為Abc的異步Action時,將EndAbc作為查找依據交由現成的方法來查詢——但是,如果又有一個請求是直接針對一個名為EndAbc的同步Action的那又怎么辦呢?

由于這些問題存在,我在去年設法實現異步Action時幾乎重寫了整個ActionInvoker——其復雜程度可見一斑。而且那個實現對于一些特殊情況的處理依舊不甚友好,需要開發人員在一定程度上做出妥協。這個實現在TechED 2008 China的Session中公布時我就承認它并不能讓我滿意,建議大家不要將其投入生產環境中。而現在的實現,則非常順利地解決了整個問題。雖然從理論上講還不夠“完美”,雖然還做出了一些讓步。

帶來如此多問題的原因就在于我們在設法顛覆框架內部的關鍵性設計,也就是從單一的Action方法調用,轉變為“符合APM的”二段式調用。等等,您是否感覺到了解決問題的關鍵?沒錯,那就是“符合APM的”。APM要求我們將一個行為分為BeginXxx和EndXxx兩個方法,可是既然ASP.NET MVC框架只能讓我們返回一個ActionResult對象……那么我們為什么不在這個對象里包含方法的引用——也就是一個委托對象呢?這雖然不符合正統的APM簽名,但是完全可行,不是嗎?

public class AsyncActionResult : ActionResult
{
    public AsyncActionResult(
        IAsyncResult asyncResult,
        Func<IAsyncResult, ActionResult> endDelegate)
    {
        this.AsyncResult = asyncResult;
        this.EndDelegate = endDelegate;
    }

    public IAsyncResult AsyncResult { get; private set; }

    public Func<IAsyncResult, ActionResult> EndDelegate { get; private set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.Controller
            .SetAsyncResult(this.AsyncResult)
            .SetAsyncEndDelegate(this.EndDelegate);
    }
}

由于在Action方法中可以調用BeginXxx方法,我們在AsyncActionResult中只需保留Begin方法返回的IAsyncResult,以及另一個對于EndXxx方法的引用。在AsyncActionResult的ExecuteResult方法中將會保存這兩個對象,以便在AsyncMvcHandler的EndProcessRequest方法中重新獲取并使用。根據“慣例”,我們還需要定義一個擴展方法,方便開發人員在Action方法中返回一個AsyncActionResult。具體實現非常容易,在這里就展示一下異步Action的編寫方式:

[AsyncAction]
public ActionResult AsyncAction(AsyncCallback asyncCallback, object asyncState)
{
    SqlConnection conn = new SqlConnection("...;Asynchronous Processing=true");
    SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:03';", conn);
    conn.Open();

    return this.Async(
        cmd.BeginExecuteNonQuery(asyncCallback, asyncState),
        (ar) =>
        {
            int value = cmd.EndExecuteNonQuery(ar);
            conn.Close();
            return this.View();
        });
}

至此,似乎AsyncMvcHandler也無甚秘密可言了:

public class AsyncMvcHandler : IHttpAsyncHandler, IRequiresSessionState
{
    public AsyncMvcHandler(
        Controller controller,
        IControllerFactory controllerFactory,
        RequestContext requestContext)
    {
        this.Controller = controller;
        this.ControllerFactory = controllerFactory;
        this.RequestContext = requestContext;
    }

    public Controller Controller { get; private set; }
    public RequestContext RequestContext { get; private set; }
    public IControllerFactory ControllerFactory { get; private set; }
    public HttpContext Context { get; private set; }

    public IAsyncResult BeginProcessRequest(
        HttpContext context,
        AsyncCallback cb,
        object extraData)
    {
        this.Context = context;
        this.Controller.SetAsyncCallback(cb).SetAsyncState(extraData);

        try
        {
            (this.Controller as IController).Execute(this.RequestContext);
            return this.Controller.GetAsyncResult();
        }
        catch
        {
            this.ControllerFactory.ReleaseController(this.Controller);
            throw;
        }
    }

    public void EndProcessRequest(IAsyncResult result)
    {
        try
        {
            HttpContext.Current = this.Context;
            ActionResult actionResult = this.Controller.GetAsyncEndDelegate()(result);
            if (actionResult != null)
            {
                actionResult.ExecuteResult(this.Controller.ControllerContext);
            }
        }
        finally
        {
            this.ControllerFactory.ReleaseController(this.Controller);
        }
    }
}

在BeginProcessRequest方法中將保存當前Context——這點很重要,HttpContext.Current是基于CallContext的,一旦經過一次異步回調HttpContext.Current就變成了null,我們必須重設。接著將接收到的AsyncCallback和AsyncState保留,并使用框架中現成的Execute方法執行控制器。當Execute方法返回時一整個Action方法的調用流程已經結束,這意味著其調用結果——即IAsyncResult和EndDelegate對象已經保留。于是將IAsyncResult對象取出并返回。至于EndProcessRequest方法,只是將BeginProcessRequest方法中保存下來的EndDelegate取出,調用,把得到的ActionResult再執行一遍即可。

以上的代碼只涉及到普通情況下的邏輯,而在完整的代碼中還會包括對于Action方法被某個Filter終止或替換等特殊情況下的處理。此外,無論在BeginProcessRequest還是EndProcessRequest中都需要對異常進行合適地處理,使得Controller Factory能夠及時地對Controller對象進行釋放。

#p#

ModelBinder支持

其實您到目前為止還不能使用異步Action,因為您會發現方法的AsyncCallback參數得到的永遠是null。這是因為默認的Model Binder無法得知如何從一個上下文環境中得到一個AsyncCallback對象。這一點倒非常簡單,我們只需要構造一個AsyncCallbackModelBinder,而它的BindModel方法僅僅是將AsyncMvcHandler.BeginProcessRequest方法中保存的AsyncCallback對象取出并返回:

public sealed class AsyncCallbackModelBinder : IModelBinder
{
    public object BindModel(
        ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        return controllerContext.Controller.GetAsyncCallback();
    }
}

其使用方式,便是在應用程序啟動時將其注冊為AsyncCallback類型的默認Binder:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders[typeof(AsyncCallback)] = new AsyncCallbackModelBinder();
}

對于asyncState參數您也可以使用類似的做法,不過這似乎有些不妥,因為object類型實在過于寬泛,并不能明確代指asyncState參數。事實上,即使您不為asyncState設置binder也沒有太大問題,因為對于一個異步ASP.NET請求來說,其asyncState永遠是null。如果您一定要指定一個binder,我建議您在每個Action方法的asyncState參數上標記如下的Attribute,它和AsyncStateModelBinder也已經被一并建入項目中了:

[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
public sealed class AsyncStateAttribute : CustomModelBinderAttribute
{
    private static AsyncStateModelBinder s_modelBinder = new AsyncStateModelBinder();
    public override IModelBinder GetBinder()
    {
        return s_modelBinder;
    }
}

使用方式如下:

[AsyncAction]
public ActionResult AsyncAction(AsyncCallback cb, [AsyncState]object state) { ... }

其實,基于Controller的擴展方法GetAsyncCallback和GetAsyncState均為公有方法,您也可以讓Action方法不接受這兩個參數而直接從Controller中獲取——當然這種做法降低了可測試性,不值得提倡。

限制和缺點

如果這個解決方案沒有缺陷,那么相信它已經被放入ASP.NET MVC 1.0中,而輪不到我在這里擴展一番了。目前的這個解決方案至少有以下幾點不足:

1. 沒有嚴格遵守.NET中的APM模式,雖然不影響功能,但這始終是一個遺憾。

2. 由于利用了框架中的現成功能,所有的Filter只能運行在BeginXxx方法上。

3. 由于EndXxx方法和最終ActionResult的執行都沒有Filter支持,因此如果在這個過程中拋出了異常,將無法進入ASP.NET MVC建議的異常處理功能中。

根據ASP.NET MVC框架的Roadmap,ASP.NET MVC框架1.0之后的版本中將會支持異步Action,相信以上這些缺陷到時候都能被彌補。不過這就需要大量的工作,這只能交給ASP.NET MVC團隊去慢慢執行了。事實上,您現在已經可以在ASP.NET MVC RC源代碼的MvcFutures項目中找到異步Action處理的相關內容。它添加了IAsyncController,AsyncController,IAsyncActionInvoker,AsyncControllerActionInvoker等許多擴展。雖說它們都“繼承”了現有的類,但是與我之前的判斷相似,如AsyncControllerActionInvoker幾乎完全重新實現了一遍ActionInvoker中的各種功能——我還沒有仔細閱讀代碼,因此無法判斷出這種設計是否優秀,只希望它能像ASP.NET MVC本身那樣的簡單和優雅。

【編輯推薦】

  1. 為ASP.NET MVC擴展異步Action功能(上)
  2. 詳解ASP.NET MVC的請求生命周期
  3. ASP.NET MVC實例和新RC版本中視圖方面的改進
  4. ASP.NET MVC框架視頻教程
責任編輯:楊鵬飛 來源: 博客園
相關推薦

2009-02-16 10:05:11

ActionMVCASP.NET

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-03-06 10:28:30

MVCASP.NET異步Action

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-22 16:02:39

ASP.NET MVCPagedList

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-07-24 13:20:44

MVC框架ASP.NET

2010-04-06 15:20:56

ASP.NET MVC

2009-07-22 18:07:55

論壇應用程序ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2010-02-05 08:32:32

ASP.NET MVC

2009-07-28 16:40:11

ASP.NET異步頁面

2017-03-06 11:13:57

ASP.NETCoreMVC

2009-03-31 13:12:05

ASP.NETMVC表單驗證

2021-03-08 07:32:05

Actionweb框架
點贊
收藏

51CTO技術棧公眾號

中文字幕人妻一区二区三区| 成人高清dvd| 亚洲欧美另类在线视频| 成人在线亚洲| 日韩欧美一区在线观看| 国产 福利 在线| 波多野结衣在线网站| 国产一区不卡在线| 日本久久久久久久久久久| 99国产精品无码| 人人网欧美视频| 欧美丰满少妇xxxxx高潮对白| 日韩人妻无码精品久久久不卡| 久蕉在线视频| 国产69精品久久久久毛片| 国产成人午夜视频网址| 欧美极品aaaaabbbbb| 国产精品探花在线观看| 5月丁香婷婷综合| 日韩人妻精品无码一区二区三区| 精品孕妇一区二区三区| 久久精品免费在线观看| 国产福利久久精品| 在线免费看av的网站| 国产视频一区三区| 欧美刺激性大交免费视频| 真实乱视频国产免费观看| 欧洲大片精品免费永久看nba| 色哟哟精品一区| 国产高清www| 成人日批视频| 国产精品久久99| 日本一区二区视频| 欧洲毛片在线| 99久久精品国产导航| 97在线资源站| 99久久久无码国产精品免费| 日本亚洲视频在线| 国产精品99久久99久久久二8| 青娱乐av在线| 一本精品一区二区三区| 最近2019中文字幕一页二页| www.av欧美| 亚洲最好看的视频| 日韩精品中文字幕视频在线| 男人网站在线观看| 成人av综合网| 精品电影一区二区| 色哟哟视频在线| 日韩视频在线直播| 日韩欧美资源站| 爽爽爽在线观看| 亚洲精品第一| 9191国产精品| 精品国产乱码久久久久久1区二区| 欧美黄页免费| 欧美精品在线一区二区| 色一情一区二区| 日韩成人一区| 欧美一二三四区在线| √天堂资源在线| 国产欧美日韩电影| 日韩欧美自拍偷拍| 精品少妇人妻av一区二区三区| 国产乱论精品| 亚洲免费影视第一页| 9.1成人看片免费版| 首页亚洲中字| 在线一区二区日韩| 日本福利片在线观看| 你懂的视频一区二区| 欧美激情伊人电影| 九九热在线视频播放| 久久精品道一区二区三区| 国产精品美女主播| 国产伦精品一区二区三区四区| 国产一区二区免费看| 国产女人水真多18毛片18精品 | 午夜视频久久久| 日本在线观看网站| 伊人婷婷欧美激情| 国产69精品久久久久999小说| 伊人色综合一区二区三区影院视频| 疯狂做受xxxx欧美肥白少妇| 黄色片视频在线| 欧美高清hd| 亚洲女人天堂网| 麻豆天美蜜桃91| 亚洲国产欧美国产综合一区| 日本欧美一二三区| 国产精品无码一区二区桃花视频| 成人永久aaa| 综合亚洲深深色噜噜狠狠网站| 极品尤物一区二区三区| 番号在线播放| 亚洲国产一区二区在线播放| 免费看a级黄色片| 免费观看性欧美大片无片| 日韩毛片在线观看| 欧美丰满熟妇bbbbbb| 亚洲一区二区免费看| 91免费国产网站| 久草视频视频在线播放| 亚洲欧美日本韩国| 中文字幕无码不卡免费视频| 国产剧情一区二区在线观看| 日韩精品极品视频| 欧美成人精品一区二区免费看片| 久久这里只有| 国产一区国产精品| av网站在线看| 欧美色视频一区| 日本xxx在线播放| 欧美三级黄美女| 国产91精品高潮白浆喷水| 国产一级一级国产| 成人国产一区二区三区精品| 在线国产99| 亚洲成av在线| 精品偷拍一区二区三区在线看 | 天堂网www中文在线| 亚洲三级免费电影| 国产精品视频黄色| 四虎884aa成人精品最新| 欧美日韩国产999| 国产男女无套免费网站| 久久久www成人免费毛片麻豆| 国产日本在线播放| 亚洲一区二区免费在线观看| www.亚洲天堂| 国产精品日韩无码| 国产精品久久久久影院| 少妇网站在线观看| 国产一区二区三区网| 欧美一级免费看| 天堂91在线| 欧美性生交大片免费| 污污污www精品国产网站| 国产一区观看| 操一操视频一区| 男男gaygays亚洲| 欧美xxxxxxxxx| 久久综合久久鬼| 成人蜜臀av电影| 国产美女在线一区| 欧美一级全黄| 日本欧美在线视频| 免费看男男www网站入口在线| 欧美性猛交xxxx免费看漫画 | 国产精品色噜噜| 日本超碰在线观看| 国产精品成人一区二区不卡| 国产原创欧美精品| 超碰公开在线| 欧美www视频| av黄色在线看| 国产日韩精品一区二区浪潮av| 波多野结衣作品集| 日韩久久精品| 91夜夜未满十八勿入爽爽影院 | 国产情侣久久久久aⅴ免费| 欧美精品国产一区| 狠狠综合久久av| 欧美成人免费电影| 中文字幕亚洲在线| 国产高中女学生第一次| 亚洲国产婷婷综合在线精品| 成年人的黄色片| 日韩综合小视频| www亚洲国产| 成人高潮视频| 秋霞av国产精品一区| 电影av在线| 日韩欧美自拍偷拍| 中文字幕一区在线播放| 国产精品久久久久一区二区三区共| 北条麻妃亚洲一区| 在线综合亚洲| 伊人情人网综合| 国产乱人伦丫前精品视频| 国产91热爆ts人妖在线| 国产原创在线观看| 亚洲国产日韩欧美在线99| jizz国产在线| 亚洲精品国产精华液| 草草地址线路①屁屁影院成人| 日韩激情一二三区| 中文字幕色呦呦| 免费欧美一区| 91入口在线观看| 色豆豆成人网| 欧美激情国内偷拍| 91在线网址| 亚洲精品一区二区三区99| 国产99久久久久久免费看| 一区二区在线观看不卡| 中文字幕国产专区| 高清在线观看日韩| 国产三级三级看三级| 日韩午夜免费视频| 黄色一级片网址| 国内精品久久久久久久久电影网 | 亚洲免费在线播放| 爱爱的免费视频| 国产福利精品一区| 蜜桃免费在线视频| 国产精品久久久久久模特| 好吊色这里只有精品| 国产一区网站| 噜噜噜噜噜久久久久久91| 免费精品一区| 91精品久久久久久久久久久久久| 欧亚av在线| 欧美精品久久久久久久久久| 日本电影全部在线观看网站视频| 日韩电影第一页| 性中国xxx极品hd| 欧美日本一区二区三区| 久久国产乱子伦精品| 亚洲va在线va天堂| 久热这里有精品| 国产精品卡一卡二卡三| 国产真实乱人偷精品人妻| 成人午夜视频在线观看| 精品人妻一区二区三区免费| 美女诱惑一区二区| 色一情一乱一伦一区二区三区日本| 亚洲国产三级| 女人床在线观看| 欧美激情第8页| 看一级黄色录像| 亚洲电影影音先锋| 中文字幕不卡每日更新1区2区| 日本电影一区二区| 午夜精品美女久久久久av福利| 蜜桃成人av| 欧美主播一区二区三区美女 久久精品人| 久久国产精品免费精品3p| 国产精品亚洲不卡a| 永久免费精品视频| 波多野结衣成人在线| 成人午夜三级| 国产区一区二区三区| 国内自拍欧美| 久久亚洲高清| 国产免费久久| 亚洲人成77777| 欧美疯狂party性派对| 亚洲一区二区免费视频软件合集| 日韩中字在线| 国产高清免费在线| 午夜精品久久| 婷婷五月综合缴情在线视频| 国产日韩欧美在线播放不卡| 116极品美女午夜一级| 日韩在线卡一卡二| 免费精品99久久国产综合精品应用| 六月丁香婷婷久久| 日韩欧美中文视频| 丁香天五香天堂综合| 天天躁日日躁狠狠躁av麻豆男男 | 欧美精品尤物在线| 成人直播大秀| 一级黄色免费在线观看| 影音先锋中文字幕一区| 黄色一级片播放| 日本强好片久久久久久aaa| 日本黄色的视频| 国产福利精品一区| 波多野结衣片子| 1区2区3区精品视频| 久久亚洲精品大全| 在线免费观看不卡av| 91在线你懂的| 亚洲国产精品人久久电影| 九九九伊在人线综合| 久久精品亚洲94久久精品| 毛片网站在线看| 国产suv精品一区二区| 亚洲国产精选| 九色综合日本| 亚洲免费二区| 免费黄色日本网站| 九九久久精品视频| 91av在线免费| 国产精品的网站| av黄色在线看| 日韩无一区二区| 国产三级在线免费观看| 欧美老妇交乱视频| 日本一道高清亚洲日美韩| 亚洲一区二区在线| 精品日本12videosex| 久久久久久av无码免费网站下载| 国产精品久久久久久久免费软件| 一区二区免费av| 91免费观看在线| 黄色一级片中国| 在线观看免费亚洲| 天天摸夜夜添狠狠添婷婷| 精品精品国产国产自在线| 性感女国产在线| www.成人av| 国产精品99久久精品| 黑森林福利视频导航| 国产不卡视频在线播放| 国产日产在线观看| 色呦呦国产精品| 人妻91麻豆一区二区三区| 日韩亚洲综合在线| 人人视频精品| 精品在线一区| 欧美精品综合| 日本中文字幕观看| 中文字幕成人av| 久久久久在线视频| 亚洲精品国精品久久99热一| 色屁屁www国产馆在线观看| 国产精品主播视频| 国产精品青青草| 一区二区三区中文| 日本黄色的视频| 国产精品久久网站| 波多野结衣电车| 国产视频在线观看一区二区| 成人性生交大片免费看网站| 亚洲精品欧美日韩| 亚洲激情中文在线| 亚洲精品手机在线观看| 国产欧美一区二区在线| 久久久久女人精品毛片九一| 亚洲韩国青草视频| 国产精品—色呦呦| 国产精品theporn88| 欧美三级午夜理伦三级中文幕| 日本77777| 亚洲四区在线观看| av免费观看网址| 超薄丝袜一区二区| 亚洲精品不卡在线观看| 久久久99精品视频| 国产成人综合在线| 免费一级全黄少妇性色生活片| 日韩美女视频在线| 日韩另类在线| 国产精品三区www17con| 亚洲小说欧美另类婷婷| 在线免费看黄色片| 日韩欧美国产中文字幕| 欧美日韩影视| 国产精品热视频| 91精品91| 成人区人妻精品一区二| 欧美日韩国产综合新一区| 日本免费一区二区三区最新| 日本精品久久电影| 凹凸成人精品亚洲精品密奴| 中文字幕第88页| 一区二区三区四区视频精品免费 | 欧美在线a视频| 亚洲国产一区二区三区青草影视| 西西人体44www大胆无码| 2019精品视频| 日本大胆欧美| 精品人妻人人做人人爽夜夜爽| 亚洲国产欧美一区二区三区丁香婷 | 国产 日韩 欧美一区| 美国av一区二区三区| 奇米一区二区三区av| 国产一二三四区| 亚洲电影免费观看高清完整版在线| 日本片在线观看| 久久riav二区三区| 久久精品国产久精国产爱| 欧美三根一起进三p| 日韩精品免费在线| 欧美性生活一级| 国产不卡一区二区视频| 国产亚洲精品免费| jlzzjlzz亚洲女人18| 2020欧美日韩在线视频| 91偷拍一区二区三区精品| 欧美xxxx日本和非洲| 色综合久久久网| 婷婷色在线播放| 日本一区二区三区精品视频| 国产在线不卡一区| 成人免费视频毛片| 久久影院中文字幕| 亚洲电影一级片| 天天色天天干天天色| 色婷婷综合五月| 久久大胆人体| 色爱区成人综合网| 成人免费不卡视频| 国产精品毛片久久久久久久av| 韩国日本不卡在线| 亚洲澳门在线| 怡红院一区二区三区| 精品粉嫩超白一线天av|