亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > ASP > 正文

把aspx文件編譯成DLL文件

2024-05-04 11:06:23
字體:
來源:轉載
供稿:網友
注冊會員,創建你的web開發資料庫,前言

asp.net不是asp的簡單升級,而是微軟.net計劃中的一個重要組成部分,它依托.net的多語言與強大的類庫支持,引進了服務端html控件與web控件,自動處理控件的客戶端與服務端的 交互,為開發人員提供了類似windows下窗口編程的界面,為開發大型網絡應用程序功能提供了良好的編程接口,也能夠極大地提高開發人員的工作效率。


然而,“一次轉換,兩次編譯”過程使得aspx文件在首次執行(或更新后首次運行)時顯得略有不足,特別是在擁有大量aspx及codebehind的代碼文件的應用環境中,把aspx文件編譯成dll(在.net中,被稱為應用程序集)后再發布,省去“一次轉換、一次編譯”的時間及cpu占用率,對提高web服務的整體性能會有較大的提升。當然,編譯成dll后,對源代碼的保密性也有一定程度的提高。


本文通過對asp.net的基本處理流程及一個偶然發現的秘密的分析,介紹了在asp.net中如何建立aspx到dll的映射,如何開發一個可以處理http請求/響應的dll,以及如何設置“陷阱”,把現成的單個aspx文件與codebehind的aspx文件編譯成dll的過程,文章最后,還介紹了一個在實際操作過程的小技巧。


由于本文要涉及asp.net應用程序、命令行編譯、web.config配置文件等概念,為了使讀者能更好地理解本文內容,也為了使本文看上去不顯累贅,先就本文相對應的系統環境作一介紹:


系統環境:

win2000(sp3)+ iis5 + .net framework 1.0(中文版)。

服務器名稱:

由于本文的例子均在本機上測試,服務器名稱為localhost。

iis設置:

建立虛擬目錄dlltest(真實路徑為w:/wwwroot/dlltest),并把它設為應用程序,在dlltest下建立bin目錄。所有源文件將放在dlltest目錄下,而所有dll文件將放在dlltest/bin目錄下。

asp.net應用程序配置文件--web.config

在dlltest目錄下建立一個web.config文件,初始時該文件內容如下:

<?xml version="1.0"?>

<configuration>

<system.web />

</configuration>

命令窗口(dos窗口)

打開命令窗口,并用cd命令使當前目錄為w:/wwwroot/dlltest。


一、建立aspx到dll的映射


首先讓我們來看看一般情況下aspx文件是如何被asp.net處理的:

當一個http請求(例如“http://webserver/webapp/webpage.aspx”)從客戶端發送到iis服務器時,iis捕獲并分析這個請求,當它分析到這個請求是一個aspx頁面時,立即以“/webapp/webpage.aspx”為參數調用asp.net運行環境(aspnet_wp.exe),asp.net環境啟動后,檢查“/webapp/webpage.aspx”是否存在,若不存在,則向客戶端返回http 404(file not found)錯誤,否則在asp.net 的臨時目錄中查找相應的dll文件,若不存在或者該dll比aspx源文件“舊”,則調用csc編譯器(若aspx的服務端腳本語言是vb或jscript,則調用相應的vbc編譯器, jsc編譯器)把aspx文件編譯成dll,然后asp.net再調用該dll來處理具體的客戶請求,返回服務器響應。


從這個處理流程可以看出,一般情況下,asp.net運行環境會自動識別、檢查、更新與aspx相對應的dll。那么有沒有其它辦法可以強制把對一個aspx文件的處理“路由”到一個已編譯存在的dll呢?方法就是在asp.net應用程序配置文件web.config的system.web節的httphandlers節添加aspx到dll的映射項,語法如下:

<add verb="*" path="aspx文件名" type="類名,dll文件" />

aspx文件:需要被“路由”的虛擬名稱,擴展名必須是aspx,否則iis會先于asp.net運行環境處理該文件。

dll文件: dll文件(應用程序集)的名稱,不必輸入“.dll”。asp.net 首先在應用程序的專用 /bin 目錄中搜索程序集 dll,然后在系統程序集緩存中搜索程序集 dll。

類名: 由于一個dll可能會有多個名稱空間或多個類,因此必須指明當dll調用時自動加載哪個類。


例如,某一asp.net應用程序的web.config文件如下:

<?xml version="1.0"?>

<configuration>

<system.web>

<httphandlers>

<add verb="*" path="index.aspx" type="bbs.indexpage, bbs" />

</httphandlers>

</system.web>

</configuration>


該配置文件告訴asp.net,在客戶端請求本應用程序的index.aspx文件時,直接調用應用程序bin目錄下的bbs.dll,并自動加載其中的bbs.indexpage類。


二、開發能處理html頁面的dll


應該指出的是,并不是所有的應用程序集dll都能實現http請求/響應模式。還是來看一下microsoft asp.net快速入門教程(http://chs.gotdotnet.com/quickstart/aspplus/)中關于“http 處理程序和工廠”的描述:


asp.net 提供低級別的請求/響應 api,使開發人員能夠使用 .net 框架類為傳入的 http 請求提供服務。為此,開發人員需創作支持 system.web.ihttphandler 接口和實現 processrequest() 方法的類。當處理 http 請求不需要由高級別的頁框架抽象化提供的服務時,處理程序通常很有用。處理程序的常用用途包括篩選器和類似 cgi 的應用程序,尤其是那些返回二進制數據的應用程序。


asp.net 收到的每個傳入 http 請求最終由實現 ihttphandler 的類的特定實例來處理。ihttphandlerfactory 提供了處理 ihttphandler 實例 url 請求的實際解析的結構。除了 asp.net 提供的默認 ihttphandlerfactory 類外,開發人員還可以選擇創建和注冊工廠以支持大量的請求解析和激活方案。


從這段文字可以看出,當aspx頁面不涉及.net框架提供的高級界面技術(如數據緩存、狀態保持、web窗體控件引用等等)時,且向客戶端輸出的不是復雜的html文本,特別是只向客戶端返回二進制數據(如圖片,聲音等)時,可以用一個.cs應用程序文件(本文使用c#語言,如果是用vb或jscript,...)來替代,而該應用程序必須有一個實現system.web.ihttphandler 接口和并實現 processrequest() 方法的類。一個簡單的例子如下:


/* 源文件:ex1.cs 開始 */


using system.web;


namespace dlltest

{

/*

類必須實現ihttphandler接口。如果程序將訪問會話狀態(session),則必須實現 irequiressessionstate 接口(不包含任何方法的標記接口)。

*/

public class ex1page : ihttphandler

{

/*

isreusable屬性告訴.net框架,本程序是否可以被多個線程同時使用。

true對應是;false對應否。

*/

public bool isreusable

{

get { return true; }

}


/*

實現processrequest方法,向客戶端返回響應數據。

本例中向客戶端返回一個簡單的html頁面

*/

public void processrequest(httpcontext context)

{

httpresponse res = context.response;


res.write("<html><body>");

res.write("<h1>dlltest - ex1(例1)</h1><hr>");

res.write("本頁面直接由dll處理");

res.write("</html></body>");

}


}

}


/* 源文件:ex1.cs 結束 */



在命令行狀態,用如下的編譯命令把ex1.cs編譯成ex1.dll,并把它存放在bin目錄下。

csc /t:library /out:bin/ex1.dll ex1.cs
在配置文件web.config中添加aspx->dll映射,添加后,web.config應該是這樣子的:

<?xml version="1.0"?>

<configuration>

<system.web>

<httphandlers>

<add verb="*" path="dlltest1.aspx" type="dlltest.ex1page, ex1" />

</httphandlers>

</system.web>

</configuration>


現在當瀏覽器訪問http://localhost/dlltest/dlltest1.aspx時,實際上就是調用了ex1.dll中dlltest.ex1page類的processrequest方法,在瀏覽中應該可以看到一個簡單的頁面。



三、把單個aspx文件編譯成dll


從上一節微軟公開描述的“言外之意”來看,微軟是不支持讓開發人員直接把aspx文件編譯成dll的。然而,asp.net高級界面技術(服務端html控件,web控件等等)都是需要通過aspx文件才能展現出來的,如果為了dll的運行效率而放棄aspx的高級特性,則顯然是得不嘗失的。


現在靜下心來分析一下:

csc編譯器只是一個c#語言的編譯器,它只能對符合c#語言規范的文件進行編譯,而aspx文件的格式顯然不符合c#語言規范,所以csc編譯器是無法對aspx源文件進行編譯的。

因此,要想把aspx文件編譯成dll文件,必然要先把aspx文件轉化成csc編譯器能識別的cs源文件。那么用什么工具來進行轉換呢?雖然我深信這個工具一定是隱藏在.net framework里面,但在查閱了大量的asp.net及.net的公開文檔及參考手冊,資料之后,仍找不到相關資料。


呵呵,天無絕人之路,一個偶然的機會,還是讓我發現了這個秘密。


來看看源文件ex2.aspx:


/* 源文件:ex2.aspx 開始 */


<%@ page language="c#" %>


<script runat="server">


/*

你沒看錯,下一行就是“abcdefg”,正是這一行,才讓我有機會寫出本篇文章^_^;

在文中,我把這一行稱作“代碼陷阱”

*/


abcdefg // 代碼陷阱


void page_load(object src, eventargs args)

{

if( !ispostback ) notelabel.text = "請輸入您的姓名:";

}


void onnamesubmit(object src, eventargs args)

{

string name = f_name.value;

notelabel.text = (name=="") ? "姓名不能為空" : name +",您好。歡迎光臨!";

}

</script>


<html>

<body>

<form runat="server">

<h1>dlltest - ex2(例2)</h1>

<hr>

<asp:label runat="server" id="notelabel" style="color:red; font-weight:bold" />

<input runat="server" id="f_name" size="8">

<button runat="server" onserverclick="onnamesubmit">確定</button>

</form>

</body>

</html>


/* 源文件:ex2.aspx 結束 */


如果把“代碼陷阱”注釋掉或刪掉,那么ex2.aspx就是一個簡單的asp.net文件,用ie瀏覽此頁面可以發現它能正常工作。


現在讓我們打開“陷阱”,來看看asp.net到底返回了什么?


返回的是一個“編譯錯誤”的頁面,報告源文件無法通過編譯。讓我們感興趣的是該頁面最下方的一個名為“顯示完整的編譯源”的超鏈接,點擊些鏈接,就能看到這個由ex2.aspx轉換而來的cs源文件(“完整的編譯源”)的完整內容。把這部分“完整的編譯源”去掉前面的行號信息和其它的一些編譯開關(主要是#line編譯命令),并關閉那個可愛的“代碼陷阱”(用//把它注釋掉或直接把它delete也行),整理后保存為ex2_aspx.cs:


/* 源文件:ex2_aspx.cs 開始 */


/*

從下面的說明可以看出,確實有一個未公開的工具來完成把aspx文件轉化成cs源文件

*/
//------------------------------------------------------------------------------

// <autogenerated>

// this code was generated by a tool.

// runtime version:1.0.3705.0

//

// changes to this file may cause incorrect behavior and will be lost if

// the code is regenerated.

// </autogenerated>

//------------------------------------------------------------------------------


/*

奇怪的是:命名空間居然是asp而不是aspx

建議把該名稱改成適合應用程序的名稱,防止命名沖突,例如針對本文,可以改成dlltest

這里沒改是為了讓大家看清它的原貌

*/

namespace asp {

using system;

using system.collections;

using system.collections.specialized;

using system.configuration;

using system.text;

using system.text.regularexpressions;

using system.web;

using system.web.caching;

using system.web.sessionstate;

using system.web.security;

using system.web.ui;

using system.web.ui.webcontrols;

using system.web.ui.htmlcontrols;


/*

1、注意一下類名的構成,如果必要,可以把它改成有意義的名稱,例如針對本文,可以改成ex2page

2、注意它的基類。syste.web.ui.page實現了ihttphandler接口,由于要訪問session,所以也實現了irequiressessionstate接口。

*/

public class ex2_aspx : system.web.ui.page, system.web.sessionstate.irequiressessionstate {


private static int __autohandlers;

protected system.web.ui.webcontrols.label notelabel;

protected system.web.ui.htmlcontrols.htmlinputtext f_name;

protected system.web.ui.htmlcontrols.htmlbutton __control3;

protected system.web.ui.htmlcontrols.htmlform __control2;

private static bool __intialized = false;

private static system.collections.arraylist __filedependencies;


/* 現在可以關掉“陷阱”了 */

// abcdefg


void page_load(object src, eventargs args)

{

if( !ispostback ) notelabel.text = "請輸入您的姓名: ";

}


void onnamesubmit(object src, eventargs args)

{

string name = f_name.value;


notelabel.text = (name=="") ? "姓名不能為空" : name +",您好。歡迎光臨!";

}


/* 構造函數 */

public ex2_aspx() {

system.collections.arraylist dependencies;

if ((asp.ex2_aspx.__intialized == false)) {

dependencies = new system.collections.arraylist();


/*

應該把下面這行注釋掉,讓dll成為一個無依賴的獨立文件

防止在dll運行時再次去查找、比較它的“依賴”文件的新舊

*/

//dependencies.add("w://wwwroot//dlltest//ex2.aspx");

asp.ex2_aspx.__filedependencies = dependencies;

asp.ex2_aspx.__intialized = true;

}

}


protected override int autohandlers {

get {

return asp.ex2_aspx.__autohandlers;

}

set {

asp.ex2_aspx.__autohandlers = value;

}

}


protected system.web.httpapplication applicationinstance {

get {

return ((system.web.httpapplication)(this.context.applicationinstance));

}

}


public override string templatesourcedirectory {

get {

return "/dlltest";

}

}


private system.web.ui.control __buildcontrolnotelabel() {

system.web.ui.webcontrols.label __ctrl;

__ctrl = new system.web.ui.webcontrols.label();

this.notelabel = __ctrl;

__ctrl.id = "notelabel";

((system.web.ui.iattributeaccessor)(__ctrl)).setattribute("style", "color:red; font-weight:bold");

return __ctrl;

}


private system.web.ui.control __buildcontrolf_name() {

system.web.ui.htmlcontrols.htmlinputtext __ctrl;

__ctrl = new system.web.ui.htmlcontrols.htmlinputtext();

this.f_name = __ctrl;

__ctrl.id = "f_name";

__ctrl.size = 8;

return __ctrl;

}


private system.web.ui.control __buildcontrol__control3() {

system.web.ui.htmlcontrols.htmlbutton __ctrl;

__ctrl = new system.web.ui.htmlcontrols.htmlbutton();

this.__control3= __ctrl;

system.web.ui.iparseraccessor __parser = ((system.web.ui.iparseraccessor)(__ctrl));

__parser.addparsedsubobject(new system.web.ui.literalcontrol("確定"));

__ctrl.serverclick += new system.eventhandler(this.onnamesubmit);

return __ctrl;

}


private system.web.ui.control __buildcontrol__control2() {

system.web.ui.htmlcontrols.htmlform __ctrl;

__ctrl = new system.web.ui.htmlcontrols.htmlform();

this.__control2= __ctrl;

system.web.ui.iparseraccessor __parser = ((system.web.ui.iparseraccessor)(__ctrl));

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n <h1>dlltest - ex2(例2)</h1>/r/n <hr>/r/n "));

this.__buildcontrolnotelabel();

__parser.addparsedsubobject(this.notelabel);

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n "));

this.__buildcontrolf_name();

__parser.addparsedsubobject(this.f_name);

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n "));

this.__buildcontrol__control3();

__parser.addparsedsubobject(this.__control3);

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n "));

return __ctrl;

}


private void __buildcontroltree(system.web.ui.control __ctrl) {

system.web.ui.iparseraccessor __parser = ((system.web.ui.iparseraccessor)(__ctrl));

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n/r/n<html>/r/n<body>/r/n "));

this.__buildcontrol__control2();

__parser.addparsedsubobject(this.__control2);

__parser.addparsedsubobject(new system.web.ui.literalcontrol("/r/n</body>/r/n</html>/r/n"));

}


protected override void frameworkinitialize() {

this.__buildcontroltree(this);

this.filedependencies = asp.ex2_aspx.__filedependencies;

this.enableviewstatemac = true;

}


public override int gettypehashcode() {

return -11574299;

}

}

}


/* 源文件:ex2_aspx.cs 結束 */


相信大家在分析了這個文件之后,會對asp.net運行原理有更進一步的認識(與本文無關,不詳述)。


在命令行狀態,用如下的編譯命令把ex2_aspx.cs編譯成ex2.dll,并把它存放在bin目錄下。

csc /t:library /out:bin/ex2.dll ex2_aspx.cs


在配置文件web.config中添加aspx->dll映射,即在system.web節的httphandlers添加下面一行:

<add verb="*" path="dlltest2.aspx" type="asp.ex2_aspx, ex2" />



現在當瀏覽器訪問http://localhost/dlltest/dlltest2.aspx時,就如同訪問ex2.aspx一樣。當然,現在即使ex2.aspx不存在,或者已經更新過,也不會對頁面訪問有任何影響,除非重新生成bin/ex2.dll。



四、把codebehind的aspx文件編譯成dll


對于把codebehind的aspx文件編譯成dll,其中把aspx文件轉化成cs源文件的原理同上,也是先設置一個“代碼陷阱”,然后把“完整的編譯源”進行適當整理,保存為cs源文件。區別是在編譯成dll時的步驟:(為敘述方便,假設界面文件為ex3.aspx,codebehind文件為ex3.aspx.cs,ex3.aspx的“完整編譯源”保存為ex3_aspx.cs)

第一步:先用如下命令把ex3.aspx.cs編譯成bin/ex3.aspx.cs.dll

csc /t:library /out:bin/ex3.aspx.cs.dll ex3.aspx.cs

第二步:再用如下命令把ex3_aspx.cs編譯成bin/ex3.dll

csc /t:library /r:bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs


然后在配置文件web.config中添加aspx->dll映射,即在system.web節的httphandlers添加下面一行:

<add verb="*" path="dlltest3.aspx" type="asp.ex3_aspx, ex3" />


現在打開瀏覽器,訪問http://localhost/dlltest/dlltest3.aspx試試。


五、一點小技巧


在設置“陷阱”把aspx文件轉化成cs源文件時,一般是使用copy、paste方法把“完整的編譯源”保存在記事本或vs.net或其它asp.net開發環境,再進行整理后保存為cs源文件的。

整理,就是把paste進來的行號信息與“#line”編譯指令去掉。如果是手動地刪掉這些信息,則會太麻煩,即使是一個簡單的如ex2.aspx的文件,也會產生約270行的“完整的編譯源”。

我所使用的一個小技巧是:在記事本里,用替換的方法來快速整理。用"/* 行"來全部替換"行",用":*/"來全部替換":",用"// #line 行"來全部替換"#line",替換完成之后,再把“代碼陷阱”注釋掉,把主類構造函數里設置“依賴文件”的語句全部注釋掉,這樣就算整理完成了。
上一篇:Aspx中導Excel

下一篇:深入講解 ASP+ 驗證

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青青久久av北条麻妃海外网| 日本久久久久亚洲中字幕| 一区国产精品视频| 亚洲人成电影网站| 国产精品美女在线| 国产精品美女午夜av| 久久久久久香蕉网| 57pao成人永久免费视频| 国产精品久久久久国产a级| 国产欧美日韩丝袜精品一区| 欧美精品在线免费观看| 欧美国产视频日韩| 亚洲精品不卡在线| 久久激情五月丁香伊人| 亚洲一区亚洲二区| 国产精品美乳一区二区免费| 日韩在线观看网址| 国产精品香蕉在线观看| 国产精品电影一区| 亚洲色图日韩av| 日韩av最新在线| 午夜精品久久久久久久白皮肤| 91在线网站视频| 欧美日韩亚洲视频一区| 久久国产精品久久久久久久久久| 国产精品久久久久影院日本| 成人精品视频99在线观看免费| 国产97色在线| 欧美在线视频免费播放| 成人福利视频在线观看| 欧美www视频在线观看| 欧美激情一区二区三区在线视频观看| 2019中文字幕在线| 国产ts人妖一区二区三区| 亚洲老板91色精品久久| 亚洲区bt下载| 国产精品大陆在线观看| 亚洲自拍欧美色图| 欧美日韩免费区域视频在线观看| 国产精品免费一区豆花| 国产v综合ⅴ日韩v欧美大片| 亚洲国产精品国自产拍av秋霞| 亚洲精品一区av在线播放| 欧美国产第二页| 国产丝袜一区视频在线观看| 亚洲国产精品悠悠久久琪琪| 狠狠躁天天躁日日躁欧美| 亚洲第一页中文字幕| 最近2019中文免费高清视频观看www99| 国自产精品手机在线观看视频| 欧美精品成人91久久久久久久| 欧美大片在线免费观看| 日韩欧中文字幕| 亚洲免费视频网站| 国模吧一区二区| 在线观看亚洲区| wwwwwwww亚洲| 亚洲美女av在线播放| 亚洲欧美中文字幕| 久久综合伊人77777蜜臀| 精品偷拍各种wc美女嘘嘘| 欧美日韩一区二区免费视频| 国产一区二区三区在线观看视频| 精品国产电影一区| 丁香五六月婷婷久久激情| 亚洲字幕在线观看| 夜夜躁日日躁狠狠久久88av| 久久久久久国产免费| 疯狂欧美牲乱大交777| 自拍亚洲一区欧美另类| 日本成人精品在线| 亚洲成年人在线播放| 中文字幕自拍vr一区二区三区| 国产成人高清激情视频在线观看| 国产成人综合一区二区三区| 久久久天堂国产精品女人| 欧美在线观看一区二区三区| 欧美又大粗又爽又黄大片视频| 午夜精品福利视频| 国产欧美精品久久久| 亚洲电影成人av99爱色| 欧美日韩国产成人在线| 日韩av三级在线观看| 亚洲国语精品自产拍在线观看| 国产精品日日摸夜夜添夜夜av| 午夜精品福利视频| 亚洲欧美日韩精品久久奇米色影视| 欧美午夜丰满在线18影院| 欧美亚洲在线播放| 最好看的2019的中文字幕视频| 2018日韩中文字幕| 成人在线视频网| 91亚洲永久免费精品| 午夜精品久久久久久久99热浪潮| 国产成人av网址| 久久九九精品99国产精品| 欧美性xxxx极品高清hd直播| 亚洲最大激情中文字幕| 久久精品中文字幕电影| 欧美在线一级视频| 国产精品18久久久久久首页狼| 伊人伊成久久人综合网小说| 在线视频免费一区二区| 麻豆乱码国产一区二区三区| 国产成人精品免费视频| 午夜精品久久久久久久99热| 久久久久久成人| 91精品视频在线看| 超碰日本道色综合久久综合| 国产精品亚洲激情| 国内精品久久久久久中文字幕| 欧美另类99xxxxx| 久久九九精品99国产精品| 一区二区在线免费视频| 久久久免费电影| 成人午夜两性视频| 国产精品久久久久久av下载红粉| 亚洲电影成人av99爱色| 欧美激情第1页| 欧美激情手机在线视频| 久久精品亚洲精品| 一区二区三区在线播放欧美| 国产日韩专区在线| 91社区国产高清| 亚洲精品v天堂中文字幕| 国产成人精品久久亚洲高清不卡| 国产精品影院在线观看| 亚洲精品自拍视频| 国产九九精品视频| 国产欧美日韩中文| 茄子视频成人在线| 国产日韩欧美影视| 精品久久久精品| 蜜月aⅴ免费一区二区三区| 黑人巨大精品欧美一区二区免费| 欧美xxxx做受欧美| 国产午夜精品视频免费不卡69堂| 国产丝袜精品视频| 精品亚洲aⅴ在线观看| 91日韩在线视频| 国产成人在线精品| 日本精品久久电影| 欧美成人精品在线视频| 国产精品久久久999| 美女国内精品自产拍在线播放| 欧美激情免费在线| 欧美成人黄色小视频| 成人午夜高潮视频| 亚洲精品一二区| 久久69精品久久久久久国产越南| 亚洲精品日产aⅴ| 精品中文字幕在线| 日韩女优人人人人射在线视频| 亚洲欧美制服丝袜| 久久影院免费观看| 日韩美女在线观看一区| 亚洲一区二区三区四区在线播放| 日韩高清电影好看的电视剧电影| 亚洲欧美精品一区| 成人精品一区二区三区电影免费| 国产成人精品在线| 欧美在线视频在线播放完整版免费观看| 国产精品久久久999| 日韩在线观看免费网站|