成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 編寫輕量ajax組件02--淺析AjaxPro

編寫輕量ajax組件02--淺析AjaxPro

熱門標(biāo)簽:云呼外撥網(wǎng)絡(luò)電話系統(tǒng) 硅語電話機(jī)器人公司 越南河內(nèi)地圖標(biāo)注 騰訊地圖標(biāo)注位置能用多久 超級大富翁地圖標(biāo)注 ai機(jī)器人電銷資源 個(gè)人怎樣在百度地圖標(biāo)注地名 機(jī)器人電銷騙局揭秘 地圖標(biāo)注項(xiàng)目怎么樣

前言

  上一篇介紹了在webform平臺實(shí)現(xiàn)ajax的一些方式,并且實(shí)現(xiàn)一個(gè)基類。這一篇我們來看一個(gè)開源的組件:ajaxpro。雖然這是一個(gè)比較老的組件,不過實(shí)現(xiàn)思想和源碼還是值得我們學(xué)習(xí)的。通過上一篇的介紹,我們知道要調(diào)用頁面對象的方法,就是靠反射來實(shí)現(xiàn)的,關(guān)鍵是整個(gè)處理過程,包括反射調(diào)用方法、參數(shù)映射等。ajaxpro不僅在后臺幫我們實(shí)現(xiàn)了這個(gè)過程,在前臺也封裝了請求調(diào)用的方法,例如ajax的相關(guān)方法,用ajaxpro的方法就可以發(fā)送異步請求了,不需要自己封裝js或者使用js庫。接下來就對這個(gè)組件進(jìn)行淺析。

一、ajaxpro的使用

  我們先來看這個(gè)組件如何使用。

  1. 注冊AjaxHandlerFactory

  在web.config里進(jìn)行如下配置:

httpHandlers>
 add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>
/httpHandlers>

  簡單的說,請求的url符合 ajaxpro/*.ashx 格式的,都會被AjaxHandlerFactory處理,這是一個(gè)實(shí)現(xiàn)IHandlerFactory接口的工廠類,用來獲取IHandler處理程序。其中type的格式是:"名稱控件.類名稱,程序集名稱"。

  2. 在頁面類Page_Load事件進(jìn)行注冊

protected void Page_Load(object sender, EventArgs e)
{
 AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxProPage));
}

  我們傳遞了本頁面對象的Type給ResisterTypoForAjax方法,這個(gè)方法用來在前臺注冊腳本,具體會調(diào)用當(dāng)前Page對象的RegisterClientScriptBlock進(jìn)行注冊,所以.aspx文件中必須有一個(gè)form runat="server">/form>,否則腳本將無法注冊。(這里傳遞了Type,實(shí)際也可以做到不用傳遞的,內(nèi)部通過HttpContext.Current.Handler.GetType().BaseType 也可以獲得這個(gè)類型)

  3.用AjaxMethod標(biāo)記方法  

[AjaxMethod]
public Liststring> GetList(string input1,string input2)
{
 return new Liststring> { input1, input2 };
}

  AjaxMethod是一個(gè)標(biāo)記屬性,表示這個(gè)方法用于處理ajax請求,它最終通過反射執(zhí)行;它有幾個(gè)構(gòu)造函數(shù)對,對于有些需要緩存的數(shù)據(jù),可以設(shè)置緩存時(shí)間;如果我們的請求不需要使用Session,可以設(shè)置HttpSessionStateRequirement;如果請求需要異步,例如請求一個(gè)耗時(shí)的web服務(wù),也可以設(shè)置處理程序?yàn)楫惒綘顟B(tài)。

  方法的返回值可以是簡單的類型,也可以是復(fù)雜的類型;例如集合類型在前臺獲得就是一個(gè)數(shù)組。

  4.前臺調(diào)用

  后臺的配置和使用都非常簡單,接下來我們看前臺如何發(fā)起請求。

function GetList() {
 //var result = AjaxProNamespace.AjaxProPage.GetList("a", "b").value;
 //console.log(result);
 AjaxProNamespace.AjaxProPage.GetList("a", "b", function (result) {
  console.log(result);
 });  
}

  這里AjaxProNamespace 是頁面類所在的名稱空間,AjaxProPage 就是頁面類的名稱,GetList是標(biāo)記的方法。為什么可以這樣寫呢?前面說到,ajaxpro會在前臺注冊腳本,它會根據(jù)我們頁面對象的相關(guān)信息生成如下腳本,所以我們才可以這樣調(diào)用,而完全不用自己寫js或者用jquery庫的方法。

if(typeof AjaxProNamespace == "undefined") AjaxProNamespace={};
if(typeof AjaxProNamespace.AjaxProPage_class == "undefined") AjaxProNamespace.AjaxProPage_class={};
AjaxProNamespace.AjaxProPage_class = function() {};
Object.extend(AjaxProNamespace.AjaxProPage_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
 GetList: function(input1, input2) {
  return this.invoke("GetList", {"input1":input1, "input2":input2}, this.GetList.getArguments().slice(2));
 },
 url: '/ajaxpro/AjaxProNamespace.AjaxProPage,TestAjaxProSourceCode.ashx'
}));
AjaxProNamespace.AjaxProPage = new AjaxProNamespace.AjaxProPage_class();

  GetList的參數(shù)對應(yīng)后臺方法的參數(shù),類型必須可以轉(zhuǎn)換,否則調(diào)用會失敗。最后一個(gè)參數(shù)為回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù)是對返回結(jié)果進(jìn)行封裝的對象,其value屬性就是執(zhí)行成功返回的值,如上面返回的就是一個(gè)數(shù)組對象。其error包括了失敗的信息。

  注意,上面注釋掉的部分是同步請求的做法,這往往不是我們想要的,我曾經(jīng)就見過有人這樣錯(cuò)誤的使用。

二、ajaxpro處理請求原理

  這里主要關(guān)注組件處理ajax請求的過程,其它輔助功能不做介紹。

  1.生成輔助腳本

  在Page_Load事件里我們調(diào)用了AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxProPage)); 用來注冊所需要的腳本。我們注意到在前臺頁面引入了如下腳本:

也就是每個(gè)頁面都會都會發(fā)起這幾個(gè)請求。這幾個(gè)都是.ashx結(jié)尾的文件,但實(shí)際里面都是js代碼;這些js有的是作為資源嵌套在dll內(nèi)部,有的是自動生成的,主要是封裝了ajax請求相關(guān)方法,以及讓我們可以用:名稱空間.頁面類名稱.標(biāo)記方法名稱 這樣去調(diào)用方法。為什么要用.ashx而不是用.js呢?因?yàn)樽鳛榻M件內(nèi)部的資源文件,外部無法直接請求.js文件,而.ashx可以被攔截,然后用Response.Write將內(nèi)容輸出。

  如果每次都生成和發(fā)送這些腳本的效率是很低的,ajaxpro內(nèi)部的處理是判斷請求頭的If-None-Math和If-Modified-Since,如果兩個(gè)都和緩存的一樣,就返回一個(gè)304狀態(tài)碼。所以,客戶端只有首次請求服務(wù)端會返回文件的內(nèi)容,后續(xù)的都只返回304表示使用本地緩存。我們刷新頁面可以驗(yàn)證這個(gè)過程:

  2. 攔截請求

  HttpHandler(IHttpHandler) 和 HttpModule(IHttpModule) 是asp.net 兩個(gè)重要的組件,讓我們可以在asp.net的基礎(chǔ)上很方便的進(jìn)行擴(kuò)展。HttpHandler對應(yīng)某種具體的請求,例如.ashx,.aspx等;HttpModule是一個(gè)攔截器,可以在管道的某個(gè)事件對所有請求進(jìn)行攔截。簡單的說,在管道中,HttpApplication會觸發(fā)一系列事件,我們在通過HttpModule對某個(gè)事件進(jìn)行注冊,例如我們可以在處理程序?qū)ο笊汕皵r截請求,然后映射到自己的處理程序;而實(shí)際處理請求返回結(jié)果的是HttpHandler,例如Page用來生成html。

  以asp.net mvc框架為例,它是建立在asp.net 路由機(jī)制的基礎(chǔ)上的,asp.net 路由系統(tǒng)通過一個(gè)UrlRoutingModule對請求進(jìn)行攔截,具體是在PostResolveRequestCache事件進(jìn)行攔截,對url進(jìn)行解析,封裝相應(yīng)的路由數(shù)據(jù)后,最終將請求交給一個(gè)MvcHandler進(jìn)行處理,MvcHandler實(shí)現(xiàn)了IHttpHandler接口。

  前面我們進(jìn)行了如下配置:add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/> 這表明了任何的以 ajaxpro/任意名稱.ashx結(jié)尾的 Post/Get 請求,都交給AjaxPro.AjaxHandlerFactory進(jìn)行處理,它是一個(gè)實(shí)現(xiàn)了IHandlerFactory的處理程序工廠,用來生成具體的IHttpHandler。組件內(nèi)部定義了多個(gè)實(shí)現(xiàn)IHttpHandler的類,有的是為了生成js腳本的,對于處理ajax請求,主要分為兩類:異步(IHttpAsyncHandler)和非異步(IHttpHandler);在這兩類的基礎(chǔ)上,對于Session的狀態(tài)的支持又分為三種:支持讀寫(實(shí)現(xiàn)IRequiresSessionState標(biāo)記接口)的Handler、只讀(實(shí)現(xiàn)IReadOnlySessionState標(biāo)記接口)的Handler和不支持Session的Handler。具體生成什么樣的Handler是通過AjaxMethod進(jìn)行判斷的。

  IHttpHandler的ProcessRequest(異步就是BeginProcessRequest)就用來執(zhí)行請求返回輸出結(jié)果的。如果只需要一種處理程序我們也可以實(shí)現(xiàn)IHttpHandler。IHandlerFactory的定義如下:

public interface IHttpHandlerFactory
{
 IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
 void ReleaseHandler(IHttpHandler handler);
} 

  所以,ajaxpro的所有請求都會符合ajaxpro/*.ashx格式,然后在GetHandler方法,就可以進(jìn)行具體的處理,返回結(jié)果是IHttpHandler;以非異步狀態(tài)為例,如果我們配置了需要Session,就會生成一個(gè)實(shí)現(xiàn)IHttpHandler和IRequiresSessionState的Handler,如果需要只讀的Session,就會生成一個(gè)實(shí)現(xiàn)IHttpHandler和IReadOnlySessionState的Handler;這些信息可以通過反射從AjaxMethod標(biāo)記屬性獲得。AjaxHandlerFactory的主要代碼如下:

public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
 string filename = Path.GetFileNameWithoutExtension(context.Request.Path);
 Type t = null;
 Exception typeException = null;
 bool isInTypesList = false;
 switch (requestType)
 {
  //Get請求,獲取前面的那4個(gè)腳本
  case "GET": 
   switch (filename.ToLower())
   {
    case "prototype":
     return new EmbeddedJavaScriptHandler("prototype");
    case "core":
     return new EmbeddedJavaScriptHandler("core");
    case "ms":
     return new EmbeddedJavaScriptHandler("ms");
    case "prototype-core":
    case "core-prototype":
     return new EmbeddedJavaScriptHandler("prototype,core");
    case "converter":
     return new ConverterJavaScriptHandler();
    default:
     return new TypeJavaScriptHandler(t);
   }
  case "POST":
   IAjaxProcessor[] p = new IAjaxProcessor[2];
   p[0] = new XmlHttpRequestProcessor(context, t);
   p[1] = new IFrameProcessor(context, t);
   for (int i = 0; i  p.Length; i++)
   {
    if (p[i].CanHandleRequest)
    {
     //獲取標(biāo)記方法的AjaxMethod屬性
     AjaxMethodAttribute[] ma = (AjaxMethodAttribute[])p[i].AjaxMethod.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
     bool useAsync = false;
     HttpSessionStateRequirement sessionReq = HttpSessionStateRequirement.ReadWrite;
     if (ma.Length > 0)
     {
      useAsync = ma[0].UseAsyncProcessing;
      if (ma[0].RequireSessionState != HttpSessionStateRequirement.UseDefault)
       sessionReq = ma[0].RequireSessionState;
     }
     //6種Handler,根據(jù)是否異步,session狀態(tài)返回指定的Handler
     switch (sessionReq)
     {
      case HttpSessionStateRequirement.Read:
       if (!useAsync)
        return new AjaxSyncHttpHandlerSessionReadOnly(p[i]);
       else
        return new AjaxAsyncHttpHandlerSessionReadOnly(p[i]);
      case HttpSessionStateRequirement.ReadWrite:
       if (!useAsync)
        return new AjaxSyncHttpHandlerSession(p[i]);
       else
        return new AjaxAsyncHttpHandlerSession(p[i]);
      case HttpSessionStateRequirement.None:
       if (!useAsync)
        return new AjaxSyncHttpHandler(p[i]);
       else
        return new AjaxAsyncHttpHandler(p[i]);
      default:
       if (!useAsync)
        return new AjaxSyncHttpHandlerSession(p[i]);
       else
        return new AjaxAsyncHttpHandlerSession(p[i]);
     }
    }
   }
   break;
 }
 return null;
}

  3. 反射執(zhí)行方法

  當(dāng)獲得一個(gè)處理本次請求的Handler后,就可以在其ProcessRequest(異步為BeginProcessRequest)執(zhí)行指定的方法。要執(zhí)行一個(gè)頁面對象的方法,我們必須知道指定頁面所在的程序集,名稱空間,頁面類的名稱以及方法的名稱。這似乎符合我們前面:名稱空間.類名稱.方法名稱的調(diào)用方式。為了與一般請求區(qū)分開,讓組件具有足夠的獨(dú)立性,ajaxpro只攔截符合"ajaxpro/*.ashx格式的請求,這說明我們的ajax請求也要符合這個(gè)格式。如:http://localhost:50712/ajaxpro/AjaxProNamespace.AjaxProPage,TestAjaxProSourceCode.ashx,這個(gè)格式由前臺腳本自動生成,并不需要我們?nèi)?gòu)造。仔細(xì)觀察,會發(fā)現(xiàn)AjaxProNamespace.AjaxProPage,TestAjaxProSourceCode 就是頁面類的完全限定名:名稱空間.類名稱,程序集名稱,通過這個(gè)我們就可以生成具體的Type,然后進(jìn)行反射獲取信息。那么方法的名稱呢?ajaxpro將其放在http header 中,名稱為:X-AjaxPro-Method。有了這些信息,就可以反射執(zhí)行方法了。這里核心代碼為:

internal void Run()
{
 try
 {
  //設(shè)置輸出結(jié)果不緩存(這不一定是我們想要的)
  p.Context.Response.Expires = 0;
  p.Context.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
  p.Context.Response.ContentType = p.ContentType;
  p.Context.Response.ContentEncoding = System.Text.Encoding.UTF8;
  //驗(yàn)證ajax請求
  if (!p.IsValidAjaxToken())
  {
   p.SerializeObject(new System.Security.SecurityException("The AjaxPro-Token is not valid."));
   return;
  }
  //方法參數(shù)對象數(shù)組
  object[] po = null;
  //請求處理結(jié)果
  object res = null;
  try
  {
   //獲取參數(shù)
   po = p.RetreiveParameters();
  }
  catch (Exception ex){}
  //獲取緩存的Key
  string cacheKey = p.Type.FullName + "|" + p.GetType().Name + "|" + p.AjaxMethod.Name + "|" + p.GetHashCode();
  if (p.Context.Cache[cacheKey] != null)
  {
   //如果緩存存在,則直接使用緩存
   p.Context.Response.AddHeader("X-" + Constant.AjaxID + "-Cache", "server");
   p.Context.Response.Write(p.Context.Cache[cacheKey]);
   return;
  }
  try
  {
   if (p.AjaxMethod.IsStatic)
   {
    //使用反射調(diào)用靜態(tài)方法
    try
    {
     res = p.Type.InvokeMember(
      p.AjaxMethod.Name,
      System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod,
      null, null, po);
    }
    catch (Exception ex){}
   }
   else
   {
    try
    {
     //創(chuàng)建實(shí)例對象,反射調(diào)用實(shí)例方法
     object c = (object)Activator.CreateInstance(p.Type, new object[] { });
     if (c != null)
     {
      res = p.AjaxMethod.Invoke(c, po);
     }
    }
    catch (Exception ex){}
   }
  }
  catch (Exception ex){}
  try
  {
   //判斷結(jié)果是不是xml,如是設(shè)置ContentType
   if (res != null  res.GetType() == typeof(System.Xml.XmlDocument))
   {
    p.Context.Response.ContentType = "text/xml";
    p.Context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    ((System.Xml.XmlDocument)res).Save(p.Context.Response.OutputStream);
    return;
   }
   string result = null; ;
   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   try
   {
    result = p.SerializeObject(res);
   }
   catch (Exception ex){}
   //如果需要緩存,則將結(jié)果寫入緩存
   if (p.ServerCacheAttributes.Length > 0)
   {
    if (p.ServerCacheAttributes[0].IsCacheEnabled)
    {
     p.Context.Cache.Add(cacheKey, result, null, DateTime.Now.Add(p.ServerCacheAttributes[0].CacheDuration), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
    }
   }
  }
  catch (Exception ex){}
 }
 catch (Exception ex){}
}

三、總結(jié)

  我們總結(jié)一下ajaxpro的核心處理流程,它通過一個(gè)IHttpHandlerFactory攔截指定格式的url,然后從中獲取類型的完全限定名生成類型對象,接著通過反射獲取標(biāo)記方法的特性,生成一個(gè)自定義的實(shí)現(xiàn)IHttpHandler接口的對象;在其ProcessRequest方法中,從http headers獲取方法名稱,通過反射進(jìn)行參數(shù)映射并執(zhí)行函數(shù)。

  ajaxpro 具有如下優(yōu)點(diǎn):

  1. 配置簡單。

  2. 可以配合其它組件一起使用。

  3. 封裝前臺腳本,我們不用自己封裝或者使用其它腳本庫。

  4. 對返回值處理,我們可以返回簡單類型或者復(fù)雜類型都會自動序列化?! ?/p>

  缺點(diǎn)是:

  1. 頁面會多出4個(gè)請求。盡管會利用304緩存,但還是需要發(fā)送請求到服務(wù)器。

  2. ajax無法使用Get請求。由于自定義了url格式,使用這種格式就無法用Get請求了,我們知道Get請求是可以被瀏覽器緩存的,雅虎前端優(yōu)化建議中有一條就是多用get請求。事實(shí)上,應(yīng)該把名稱空間.類名稱,程序集放到http header中,然后提供了一個(gè)type類型的參數(shù)讓我們自由選擇。

  3. 與form runat="server">綁定。目的是用了為我們生成前臺腳本,但如果我們希望用.html文件 + .aspx.cs 的方式就不能用了(博客園有些頁面就用了這種方式);甚至我們的接口可能要給移動端使用,這種方便就變成了限制。

  4. 反射。這樣效率是比較低的,它甚至沒有像我們之前的頁面類一樣,對MethodInfo進(jìn)行緩存。

  可以看出,如果在不太計(jì)較效率的情況,這個(gè)組件還是值得使用的。這里只是做一個(gè)核心的介紹,里面還有很多其它功能,這是ajaxpro組件的源代碼,有興趣的朋友可以研究研究。

您可能感興趣的文章:
  • Ajax核心XMLHTTP組件資料
  • 編寫輕量ajax組件01-與webform平臺上的各種實(shí)現(xiàn)方式比較
  • 編寫輕量ajax組件第三篇實(shí)現(xiàn)

標(biāo)簽:舟山 海南 邢臺 遼源 林芝 洛陽 內(nèi)蒙古 鄭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《編寫輕量ajax組件02--淺析AjaxPro》,本文關(guān)鍵詞  編寫,輕量,ajax,組件,02--,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《編寫輕量ajax組件02--淺析AjaxPro》相關(guān)的同類信息!
  • 本頁收集關(guān)于編寫輕量ajax組件02--淺析AjaxPro的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    朝桐光av在线| 久久久综合九色合综国产精品| 黄色高清无遮挡| 全部av―极品视觉盛宴亚洲| 国产一卡2卡3卡4卡网站免费| 日韩色级片先锋影音| 成人一区二区免费视频| av磁力番号网| www.操操操.com| 九色porny自拍视频在线播放| 久精品免费视频| 欧美videos另类精品| 欧美日韩精品免费观看视完整| 日本一区视频在线观看免费| 88国产精品欧美一区二区三区| 欧美激情视频一区二区三区不卡| 成人免费无码av| 国产成人精品日本亚洲| 国产视频精品xxxx| 欧美午夜黄色| 一区在线观看| 国产精品18久久久久久久网站| 春暖花开亚洲一区二区三区| 成人免费一区二区三区牛牛| 日本免费黄色小视频| 成人国产精品一区| 香蕉视频禁止18| 私拍精品福利视频在线一区| 成人高清免费在线播放| 男男h黄动漫啪啪无遮挡软件| 美女被到爽高潮视频| 97精品久久久| 国产精品久久久久久久裸模| 91av免费观看91av精品在线| 国产成人无码精品久久久性色| 成人激情视频在线播放| 五月激情综合| 97国产在线视频| 男女男精品视频网| 精品伦理精品一区| 亚洲你懂的在线视频| 天天做天天摸天天爽国产一区| 亚洲**2019国产| 久久99精品久久久久久园产越南| 欧美日韩免费视频| 久久综合五月| 亚洲国产精品91| 国产无遮无挡120秒| 久久视频www| 日韩美女国产精品| 一本色道久久综合狠狠躁的番外| 国产精品最新乱视频二区| 欧美日韩不卡一区二区| 精品少妇在线视频| 欧美亚洲另类在线| 国产精品综合av一区二区国产馆| 欧美国产精品久久| 91黄色精品| 四虎成人免费| 黄色av网站免费| 国产成人免费视频精品含羞草妖精| 精品国产欧美一区二区| 在线观看亚洲| 欧洲在线/亚洲| 久久高清免费| 特级全黄一级毛片| 欧美日韩视频精品一区二区| 亚洲午夜福利在线观看| 青青草偷拍视频| 中文字幕超清在线免费观看| 国产精品一区二区人人爽| 国产精品一级视频| 久久白虎精品| 伊人久久大香线蕉av超碰| 久久久久久久久久久久久久免费看| 干日本少妇首页| 性欧美videos另类喷潮| 欧美亚洲视频一区| 欧美乱xxxxxxxxx| 欧美日韩不卡在线| 亚洲小说欧美激情另类| 久色婷婷小香蕉久久| 日韩免费电影一区二区| 少妇精品久久久一区二区| 久久久资源网| 粉嫩精品一区二区三区在线观看| 91色婷婷久久久久合中文| 男人天堂网在线| 国产精品久久久影院| 精品一区二区三区视频日产| 美腿丝袜在线亚洲一区| 欧美成人在线免费观看| 日韩欧美色电影| 色哟哟在线观看一区二区三区| 成人免费视频caoporn| 日韩亚洲欧美中文在线| 伊人夜夜躁av伊人久久| 国产福利在线观看视频| 欧美日韩高清在线一区| kk眼镜猥琐国模调教系列一区二区| 老鸭窝av在线| 99se婷婷在线视频观看| 91美女片黄在线观看91美女| 日本不卡一区二区三区高清视频| 人妻av无码专区| 国产精品日韩精品中文字幕| 在线不卡中文字幕| 中文字幕先锋av影音资源网| 国产在线精品一区二区不卡| 福利视频理论电影| 亚洲成人一区二区三区| 在线精品视频播放| 亚洲免费视频二区| 91精品国产黑色瑜伽裤| 三级一区二区三区| 9l亚洲国产成人精品一区二三| 69sex久久精品国产麻豆| 不卡一区二区在线| 亚洲成色777777在线观看影院| 日韩高清在线一区二区| 超碰免费公开在线| 欧美激情视频一区二区三区免费| 久久性感美女视频| 在线看小视频| 亚洲视频色图| 欧美精品videos极品| 有码中文亚洲精品| 国产精品第9页| 欧美性感美女一区二区| 91福利视频免费观看| 先锋影音av中文字幕| 波多野结衣福利| 欧美精品日韩| 久久久久久国产精品免费播放| 中文字幕视频精品一区二区三区| 亚洲手机视频| 日韩视频久久| 一区二区传媒有限公司| 精品人妻在线播放| 手机看片一区二区| 黄动漫视频高清在线| 在线高清av| 青柠在线免费观看| 亚洲欧洲成人精品av97| 91国偷自产一区二区三区观看| 99精品视频免费版的特色功能| 亚洲美女性囗交| 亚洲欧美日韩成人高清在线一区| 日韩精品欧美专区| 亚洲一区综合| 老牛影视av老牛影视av| 亚洲国产精品免费| 影音先锋5566中文源资源| 亚洲一区二区三区精品中文字幕| 日本成在线观看| 免费视频91| 一卡二卡三卡日韩欧美| 日本少妇精品亚洲第一区| 久久精品国产久精国产| www.色就是色| 欧美一级视频免费观看| 亚洲天堂久久久久| 91在线资源站| 久久精品日产第一区二区三区高清版| 精品国产乱码久久久久久1区二区| 国产成人免费视频网站视频社区| 凹凸av导航大全精品| 中文字幕人妻一区二区三区| 影音先锋国产| 国产视频一区二区视频| 国产精品v日韩精品v在线观看| 欧美精品色婷婷五月综合| 亚洲一区免费网站| 综合国产第二页| www国产亚洲精品久久网站| 色视频欧美一区二区三区| 亚洲国产精品一区二区久久恐怖片| 中文字幕在线免费| 一本之道久久| 高潮一区二区三区乱码| 日韩欧美视频免费观看| 午夜国产小视频| 国产不卡一区二区视频| 麻豆av免费在线| 国产九色在线播放九色| 噜噜噜久久亚洲精品国产品麻豆| a级片在线观看视频| 青青青在线播放| 精品成人乱色一区二区| 成年人免费看的视频| 日本一区二区在线视频| 欧美日韩中文字幕一区二区三区| 加勒比婷婷色综合久久| 日韩精品综合一本久道在线视频| 高清毛片在线观看| 亚洲欧洲99久久| 国产超碰在线一区| 欧美电影免费观看完整版| 色女孩综合影院| 无码少妇精品一区二区免费动态| 国产精品v欧美精品v日本精品动漫| 五月婷婷丁香六月| bdsm精品捆绑chinese| 日韩av手机在线免费观看| 九色在线播放| 日本中文字幕视频在线| 亚洲视频在线一区观看| 成人免费福利| 国产色综合天天综合网| 国产精品欧美韩国日本久久| 免费不卡亚洲欧美| 91在线观看免费高清| 亚洲成人久久影院| 免费成人网www| 黑人巨大猛交丰满少妇| av成人影院在线| av动漫一区二区| 久久久久久久久久一区| 国产免费黄视频在线观看| 综合精品一区| 中文字幕先锋av影音资源网| 中文字幕 国产精品| 粉嫩av一区二区三区在线播放| 91精品国产综合久| 久久99精品国产一区二区三区| 成人妇女淫片aaaa视频| 欧美性猛交xxxx免费看| 久久人人爽人人爽人人片| 国产亚洲精品91在线| 国产在线精品一区二区三区》| 神马久久久久久久| 美洲天堂一区二卡三卡四卡视频| 国产农村妇女毛片精品久久| 亚洲精品v天堂中文字幕| 成熟老妇女视频| 可以直接在线观看的av| 亚洲 小说区 图片区 都市| 深夜成人在线| 717成人午夜免费福利电影| 欧美特黄级在线| 日本午夜免费一区二区| 久久国产日韩欧美| 精品久久久国产精品999| 亚洲伊人精品酒店| 成人免费视频视频在线观看免费| 国产熟妇久久777777| 亚洲黄色成人久久久| 成年人在线免费看片| 亚洲三级在线免费观看| 伪装者免费全集在线观看| 午夜免费福利视频在线观看| 丁香桃色午夜亚洲一区二区三区| 久久国产乱子精品免费女| 国产美女福利在线观看| 中文字幕人妻一区二区三区在线视频| 中文在线资源观看网站视频免费不卡| 波多野结衣一区二区在线| 欧美日韩免费| 美女福利视频导航| 91免费日韩| 精品久久久久久国产91| 日本一道高清亚洲日美韩| 亚洲日本欧美在线| 怡红院精品视频| 国产精品入口芒果| 精品一区二区三区在线播放| 天天综合中文字幕| 在线观看久久久久久| 国内免费久久久久久久久久久| 欧美一区二区三区视频免费| www四虎com| 久久久久久久久久国产精品| av免费在线视| 久久国产激情视频| 欧美成人午夜77777| 波多野结衣中文字幕一区| 国内精品露脸在线视频播放| 国产精品一区二区三区乱码| 欧美日韩亚洲一区二| 色开心亚洲综合| 中文字幕丰满乱子伦无码专区| 欧美性videos| 超碰免费在线97| a毛片毛片av永久免费| 欧美三级午夜理伦| av中文字幕不卡| 国产一级片麻豆| 成人在线观看免费高清| 性感美女视频一二三| 在线观看欧美www| 欧美不卡1区2区3区| 欧美一级黑人aaaaaaa做受| 日韩一区二区免费视频| 色视频免费版高清在线观看| 中文字幕免费高清网站| 国产va在线视频| 国产中文字幕在线播放| 国产精品稀缺呦系列在线| 国产国语刺激对白av不卡| 九色porny丨国产首页在线| 色88888久久久久久影院野外| 国产精品第二页| 亚洲精品一区二区三| 蜜桃一区二区| 欧美精品在线网站| 3d动漫精品啪啪一区二区下载| 麻豆久久久9性大片| 夜夜夜操操操| 999av视频| 最新亚洲人成网站在线观看| 粉嫩欧美一区二区三区高清影视| 精品丰满人妻无套内射| 蜜臀精品久久久久久蜜臀| av一区在线播放| 丁香一区二区| 97在线免费视频观看| 欧美91精品久久久久国产性生爱| 女~淫辱の触手3d动漫| 二区在线视频| 久久久一本精品99久久精品66| 老师我好爽再深一点的视频| 一区二区不卡在线视频 午夜欧美不卡在| 久做在线视频免费观看| 国产综合无码一区二区色蜜蜜| 老太脱裤子让老头玩xxxxx| 亚洲AV无码国产精品午夜字幕| 成年网站在线在免费播放| 亚洲午夜激情影院|