精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩免费网站| 99国产精品国产精品毛片| 亚洲图中文字幕| 在线视频日韩一区| 婷婷五月在线视频| 国产精品一色哟哟哟| 久久久久在线观看| 国产美女免费无遮挡| 成人mm视频在线观看| 成人免费小视频| 国产午夜精品一区| 一级黄色在线观看| 欧美一区精品| 日韩精品极品在线观看| 777视频在线| 金瓶狂野欧美性猛交xxxx| 91美女视频网站| 国产欧美一区二区三区在线看| 欧美精品xxxxx| 精品中文一区| 欧美一卡二卡在线观看| 每日在线更新av| 日本最新在线视频| 波多野结衣视频一区| 国产欧美日韩专区发布| 国产午夜精品无码| 首页国产精品| 日韩黄在线观看| 天堂av8在线| av免费不卡国产观看| 国产精品久99| 久久精品ww人人做人人爽| 91在线观看喷潮| 国产日韩欧美三区| 九色精品免费永久在线| 亚洲精品一区二区三区影院忠贞| 中文在线免费一区三区| 欧美日韩精品一区二区三区蜜桃 | 欧美日韩在线中文| 黄色在线视频网址| 99久久精品费精品国产风间由美 | 99视频有精品| 午夜精品久久久久久久男人的天堂| 一级片手机在线观看| 久草免费福利在线| 亚洲欧美小视频| 红杏成人性视频免费看| 欧美日韩在线亚洲一区蜜芽| 欧美精品卡一卡二| 免费在线视频欧美| 久久精品男人的天堂| 黄色免费网址大全| 欧美14一18处毛片| 中文字幕中文字幕中文字幕亚洲无线| 九九九九九九精品| 999国产精品视频免费| av在线免费网站| 国产在线播精品第三| 欧美在线观看视频| 日本一区二区三区免费视频| 91麻豆国产自产在线观看亚洲| 国产午夜精品久久久| 久久免费精品国产| 91麻豆精品激情在线观看最新| 欧美精品一二三| 91福利国产成人精品播放| 成人性生活视频| 欧美日韩国产在线播放| 国产人妻777人伦精品hd| 俺来也官网欧美久久精品| 亚洲影视资源网| 久热99视频在线观看| 嫩草影院中文字幕| av在线麻豆| 中文字幕综合网| 性欧美18一19内谢| 成人黄视频在线观看| 1024精品合集| 日韩欧美在线视频| 日韩精品久久一区二区| 天天干在线视频论坛| 亚洲夂夂婷婷色拍ww47 | avav在线播放| 青春草在线免费视频| 亚洲国产精品一区二区www| 亚洲第一偷拍网| 91chinesevideo永久地址| 国产一级黄色av| 欧美日韩专区| 97色在线视频| 成人一二三四区| 久99久精品视频免费观看| 亚洲一区中文字幕| 欧美视频xxx| 久久日韩粉嫩一区二区三区| 日韩黄色影视| 99热国产在线| 午夜天堂影视香蕉久久| 亚洲 中文字幕 日韩 无码| 久久91超碰青草在哪里看| 91精品国产全国免费观看| 欧美大喷水吹潮合集在线观看| 欧美日韩123| 久久九九精品99国产精品| 国产在线视频第一页| 老牛影视一区二区三区| 91嫩草在线视频| 深爱五月激情五月| 中文一区在线播放| 国产二区视频在线| 精品乱码一区二区三区四区| 欧美成人精品高清在线播放| 亚洲熟妇无码av| 天天色综合色| 136fldh精品导航福利| 一级片免费网站| 国产iv一区二区三区| 日韩一区二区三区高清| 波多野结衣在线观看| 欧美日韩三级一区| 国产老熟女伦老熟妇露脸| 欧美韩国日本在线观看| 91av在线视频观看| 亚洲av综合色区无码一二三区| 国产无遮挡一区二区三区毛片日本| 福利在线小视频| 第四色男人最爱上成人网| 欧美成人性战久久| 一级免费黄色录像| 老妇喷水一区二区三区| 国产精品亚洲综合| 亚洲综合影视| 欧美三片在线视频观看 | 国产成人在线视频网站| 丝袜足脚交91精品| 日本а中文在线天堂| 日韩免费高清视频| 久久噜噜色综合一区二区| 日韩精品一区第一页| 精品欧美一区二区在线观看视频| 老司机午夜在线| 欧美在线观看视频在线| 亚洲欧美在线不卡| 亚洲福利精品| 51精品国产人成在线观看| 日本暖暖在线视频| 亚洲综合日本| 亚洲伊人一本大道中文字幕| 国际av在线| 亚洲国产精品久久久久婷婷884| 国产成人黄色网址| 精品72久久久久中文字幕| 午夜免费久久久久| 亚洲免费成人在线| 亚洲一区二区综合| 性一交一黄一片| 99欧美视频| 国产精品视频永久免费播放| 日本电影一区二区在线观看| 国产成人午夜99999| 日韩中文字幕国产| 免费又黄又爽又猛大片午夜| 波多野结衣中文字幕一区二区三区| 青青草综合视频| 国产精品xnxxcom| 日韩在线免费视频| 91精品国产乱码久久久久| 日韩成人影音| 日韩一区二区三区电影| 久久国产精品国语对白| 久久福利资源站| 亚洲一卡二卡| 亚洲成人1区| 久久综合伊人77777| 国产jzjzjz丝袜老师水多| 亚洲私人影院在线观看| 真实乱偷全部视频| 中文精品久久| 成人动漫视频在线观看完整版| av理论在线观看| 欧美xingq一区二区| 国产一级生活片| 不卡av电影在线播放| 国产精品50p| 国产伦精品一区二区三区视频| 国产精品1234| 久久黄色美女电影| 欧美不卡激情三级在线观看| 日本少妇在线观看| 久久精品视频在线看| 自拍偷拍 国产| 欧美丰满老妇| 国产成人av一区二区三区| 欧美aa一级| 一夜七次郎国产精品亚洲| 国产精品久久久久毛片| 亚洲国产成人tv| 男人天堂av电影| 久久99深爱久久99精品| 精品久久久久久无码中文野结衣| 天堂成人娱乐在线视频免费播放网站 | 波多野结衣家庭教师视频| 精品一级毛片| 99在线热播| 欧美日韩大片| 欧美成人激情视频免费观看| 深夜福利在线观看直播| 欧美日韩高清一区二区| 国产精品99无码一区二区| 欧美激情在线一区二区| 麻豆tv在线观看| 日日夜夜精品视频免费| 黄色特一级视频| 国产精品免费大片| aa日韩免费精品视频一| 经典三级一区二区| 久久久久久噜噜噜久久久精品| 黄色片在线播放| 精品国产一区二区亚洲人成毛片| 无码人妻av一区二区三区波多野| 亚洲色图欧美在线| 亚洲久久久久久久| 丁香一区二区三区| 91视频这里只有精品| 久久不射中文字幕| 91九色丨porny丨国产jk| 97偷自拍亚洲综合二区| 欧美精品一区二区三区在线四季| 日本精品在线观看| 成人xxxx视频| 成人午夜视屏| 国内精品中文字幕| 在线观看男女av免费网址| 国产一区二区三区视频免费| 手机在线观看毛片| 日韩欧美视频一区| 国产精品久久久久久久一区二区 | 欧美日韩中文一区| www欧美在线| 亚洲超碰精品一区二区| 午夜少妇久久久久久久久| 国产精品伦理在线| 国产精品免费无码| 91麻豆文化传媒在线观看| 成人欧美精品一区二区| 国内久久精品视频| 爱爱爱爱免费视频| 麻豆精品视频在线| 91网址在线播放| 玖玖视频精品| 日韩免费毛片视频| 美女爽到呻吟久久久久| 可以在线看的av网站| 亚洲国产精品一区| 丰满的少妇愉情hd高清果冻传媒| 欧美私人啪啪vps| 神马午夜伦理影院| 欧美三级网页| ijzzijzzij亚洲大全| 午夜精品久久久久99热蜜桃导演 | 日韩精品第1页| 亚洲欧美综合久久久| 国产一区一区三区| 欧美日韩专区| 日韩网站在线免费观看| 99精品视频免费| www.中文字幕在线| 丝袜亚洲另类丝袜在线| 国内自拍视频一区| 蜜桃精品视频在线| 性chinese极品按摩| 久久丁香综合五月国产三级网站 | 精品无码三级在线观看视频| 天天操天天干天天做| 国产原创一区二区三区| 人妻av一区二区三区| aa级大片欧美| 国产综合精品在线| 亚洲视频一区二区在线观看| 青青青在线视频| 亚洲v日本v欧美v久久精品| 国产成人亚洲欧洲在线| 在线看日本不卡| 国产一区二区三区在线观看| 91精品欧美综合在线观看最新| www.97av.com| 亚洲福利精品在线| 精品乱码一区二区三四区视频| 国产午夜精品一区二区三区| 老司机av在线免费看| 久久久久久久国产精品视频| 亚洲校园激情春色| 成人激情免费在线| 久久综合五月婷婷| 亚洲国产欧美日韩| 欧美日韩国产一区精品一区| 国产在线观看福利| 久久99精品国产麻豆不卡| 国产白袜脚足j棉袜在线观看| 2020日本不卡一区二区视频| 天天做夜夜爱爱爱| 欧美日韩国产丝袜另类| 91成品人影院| 亚洲精品电影网站| 麻豆影视国产在线观看| 91av在线免费观看| 人人九九精品视频| 欧美在线视频二区| 欧美精品激情| 热久久精品国产| 国产麻豆欧美日韩一区| 老熟妇精品一区二区三区| 国产精品久久久久久亚洲伦| 国产奶水涨喷在线播放| 91精品在线观看入口| 久久精品色图| 欧美激情精品久久久久久| 欧美精品高清| 精品不卡在线| 天天揉久久久久亚洲精品| 国产又黄又猛视频| 成人激情免费电影网址| 天天爽天天爽天天爽| 色综合天天做天天爱| 理论片中文字幕| 精品国产一区二区三区四区在线观看| 春色校园综合激情亚洲| 91文字幕巨乱亚洲香蕉| 日韩88av| 日本精品一区二区三区四区| 免费在线观看a视频| 日本亚洲三级在线| 国产不卡一二三| 成人免费在线视频| 亚洲高清在线看| 亚洲激情免费观看| 特级毛片在线| 成人春色激情网| 欧美偷拍自拍| 欧美性久久久久| 成人动漫一区二区三区| www.99re7| 欧美日韩和欧美的一区二区| 日本一区二区在线播放| 欧美极品影院| 精品欧美日韩| 亚洲黄网站黄| 激情综合激情五月| 亚洲女性喷水在线观看一区| 一级aaaa毛片| 上原亚衣av一区二区三区| 怡红院成人在线| 日韩av高清| 老色鬼久久亚洲一区二区| 新91视频在线观看| 色网综合在线观看| 精品av中文字幕在线毛片| 日本精品性网站在线观看| 妖精视频一区二区三区免费观看| 黄色大片中文字幕| 99久久久精品| 日韩精品在线观看免费| 亚洲乱码一区av黑人高潮| 中文一区一区三区高中清不卡免费| 精品高清视频| 亚洲制服少妇| 少妇精品无码一区二区免费视频| 色综合久久99| 国产爆初菊在线观看免费视频网站 | 精品国产一区二区三区av性色| 欧洲在线视频| 国产精品日本一区二区| 夜久久久久久| 一道本在线观看| 在线看一区二区| 欧美成人三区| 亚洲综合在线做性| 伊人激情综合| 波多野结衣一本| 欧美亚洲综合在线| 国产鲁鲁视频在线观看特色| 99国产在线视频| 国产欧美日韩一级| 极品蜜桃臀肥臀-x88av| 欧美精品在线观看一区二区| 中文字幕在线播放网址| 国产精品一区二区不卡视频| 国产亚洲一区在线| 黄大色黄女片18免费| 欧美一级欧美三级在线观看| av成人福利| 欧美一区二区影视| 国产自产视频一区二区三区| 69精品久久久| 亚洲日韩中文字幕| www.成人| 国产免费观看高清视频| 国产精品蜜臀av| 人妻一区二区三区免费| 国产高清视频一区三区|