在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

完成自己的ASP.NET宿主系統(tǒng)

完成自己的ASP.NET宿主系統(tǒng)

更新時(shí)間:2022-05-14 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

實(shí)現(xiàn)自己的ASP.NET宿主系統(tǒng)

楊山河

一、 宿主概念
托管是.NET的一個(gè)很基礎(chǔ)的概念,所有的.NET應(yīng)用程序代碼要完全發(fā)揮作用需要進(jìn)入托管的環(huán)境(CLR --Common Language Runtime),而這個(gè)環(huán)境實(shí)際上就是稱作宿主(Host)為將要啟動(dòng)的.NET代碼準(zhǔn)備的。目前來講windows系統(tǒng)上,能夠擔(dān)負(fù)這個(gè)重任的有3類已存程序:
1、 shell(通常是Explorer),提供從用戶桌面啟動(dòng).NET程序,創(chuàng)建一個(gè)進(jìn)程,啟動(dòng)此進(jìn)程建立CLR
2、 瀏覽器宿主(Internet Explorer),處理從web下載的.NET代碼執(zhí)行。
3、 服務(wù)器宿主(如IIS的輔助進(jìn)程ASPnet_wp.exe)
通常來講,我們開發(fā)的ASP.NET的程序運(yùn)行在IIS的環(huán)境下(實(shí)際上由一個(gè)ISAPI控制啟動(dòng)CLR),但實(shí)際上ASP.NET程序可以擺脫IIS單獨(dú)在任何托管環(huán)境下運(yùn)行。本文討論了ASP.NET程序如何在自定義的環(huán)境中啟動(dòng),希望有助于我們了解ASP.NET的執(zhí)行原理,同時(shí)使我們開發(fā)的ASP.NET能夠在任何.NET環(huán)境下執(zhí)行,不管是服務(wù)器操作系統(tǒng)還是普通的桌面操作系統(tǒng)。

二、 IIS宿主中ASP.NET的執(zhí)行分析
關(guān)于IIS中ASP.NET的執(zhí)行細(xì)節(jié),很多文章做了詳盡權(quán)威的分析,本文不打算贅述,在此給出一些參考:
http://www.yesky.com/SoftChannel/72342380468043776/20030924/1731387.shtml
http://chs.gotdotnet.com/quickstart/ASPplus/doc/procmodel.ASPx
這些文章大致重點(diǎn)分析了:宿主環(huán)將如何啟動(dòng)、ASP.NET應(yīng)用程序如何產(chǎn)生程序集、如何加載,同宿主的交互等細(xì)節(jié)。

三、 構(gòu)造自己的ASP.NET宿主程序
ASP.NET是作為微軟ASP的替代技術(shù)出現(xiàn)的,所以我們重點(diǎn)討論如何通過web方式應(yīng)用ASP.NET(顯然還有其他方式),具體就是:我們用.NET平臺(tái)的語言編寫一個(gè)控制臺(tái)程序,這個(gè)程序啟動(dòng)一個(gè)ASP.NET應(yīng)用環(huán)境,執(zhí)行關(guān)于ASPx的請(qǐng)求。具體來講,需要做以下工作:
1、實(shí)現(xiàn)一個(gè)Web Server,監(jiān)聽所有的web請(qǐng)求,實(shí)現(xiàn)Http web hosting
2、啟動(dòng)一個(gè)應(yīng)用程序域,創(chuàng)建一個(gè)ASP.NET的ApplicationHost,建立一個(gè)ASP.NET的應(yīng)用程序域,另外還建立一個(gè)HttpWorkerRequest的具體實(shí)現(xiàn)類,該類可以處理ASPx請(qǐng)求,編譯ASPx頁,編譯后的托管代碼緩存入當(dāng)前應(yīng)用程序域,然后執(zhí)行代碼,得到執(zhí)行結(jié)果。建議在繼續(xù)閱讀下文前,仔細(xì)翻查MSDN中的關(guān)于這兩個(gè)類得參考說明。
System.Web.Hosting.ApplicationHost類用于建立一個(gè)獨(dú)立的應(yīng)用程序域。當(dāng)然不是普通的應(yīng)用程序域,而是為ASP.NET建立執(zhí)行環(huán)境,準(zhǔn)備需要的空間、數(shù)據(jù)結(jié)構(gòu)等。僅有一個(gè)靜態(tài)方法static object CreateApplicationHost(
Type host //具體的用戶實(shí)現(xiàn)類,就是ASP.NET應(yīng)用域需要加載的類
string virtualDir, //此應(yīng)用域在整個(gè)web中的執(zhí)行目錄,虛擬目錄
string physicalDir //對(duì)應(yīng)的物理目錄
);
而其中的host 參數(shù)指向一個(gè)具體的類,由于該類實(shí)際上屬于兩個(gè)應(yīng)用域之間的聯(lián)系類,在兩個(gè)應(yīng)用程序域之間編組傳遞數(shù)據(jù),所以必須要繼承自MarshalByRefObject,以允許在支持應(yīng)用程序中跨應(yīng)用程序域邊界訪問(至于為什么,建議翻查參考3)。
可以看到,我們需要啟動(dòng)兩個(gè)應(yīng)用程序域(web server功能應(yīng)用程序域和ASP.NET 應(yīng)用程序域),而這兩個(gè)(應(yīng)用程序)域之間通過跨(應(yīng)用程序)域的流對(duì)象引用來實(shí)現(xiàn),使得在ASP.NET域中執(zhí)行的結(jié)果可以通過web server域返回給請(qǐng)求者。
可以大致下圖表達(dá)
執(zhí)行ASP.NET的Web服務(wù)器端










WEB客戶端

代碼實(shí)現(xiàn)分析:
using System;
using System.Web ;
using System.Web.Hosting;
using System.IO;
using System.NET;
using System.NET.Sockets ;
using System.Text ;
using System.Threading ;

namespace MyIIS
{
class ASPHostServer
{
[STAThread]
static void Main(string[] args)
{
//創(chuàng)建并啟動(dòng)服務(wù)器
MyServer myserver=new MyServer(“/”, ”c:\\inetpub\\wwwroot\\myWeb”);
}
}

class MyServer //處理HTTP協(xié)議的服務(wù)器類
{
private ASPDOTNETHost ASPnetHost; //ASP.NET host的實(shí)例
private TcpListener mytcp; //Web監(jiān)聽套接字
bool bSvcRunning=true; //服務(wù)是否運(yùn)行指示
FileStream fs; //處理http請(qǐng)求的普通文本要求

public MyServer(string virtualDir ,vstring realPath)
{//在構(gòu)造函數(shù)中啟動(dòng)web監(jiān)聽服務(wù)
try
{
mytcp=new TcpListener(8001);
mytcp.Start(); //啟動(dòng)在8001端口的監(jiān)聽
Console.WriteLine("服務(wù)啟動(dòng)...");
//利用CreateApplicationHost方法建立一個(gè)獨(dú)立的應(yīng)用程序域執(zhí)行ASP.NET程序
ASPnetHost = ( ASPDOTNETHost )ApplicationHost.CreateApplicationHost
( typeof( ASPDOTNETHost ) , virtualDir , realPath);
Thread t=new Thread(new ThreadStart(MainSvcThread));
t.Start(); //服務(wù)線程啟動(dòng) 負(fù)責(zé)處理每一個(gè)客戶端的請(qǐng)求
}
catch(NullReferenceException)
{
Console.WriteLine("NullReferenceException throwed!") ;
}
}

public void MainSvcThread() //ASP.NET Host的web服務(wù)器的主要服務(wù)線程
{
int s=0;
string strRequest; //請(qǐng)求信息
string strDir; //請(qǐng)求的目錄
string strRequestFile; //請(qǐng)求的文件名
string strErr=""; //錯(cuò)誤信息
string strRealDir; //實(shí)際目錄
string strWebRoot=rpath; //應(yīng)用根目錄
string strRealFile=""; //正在請(qǐng)求的文件的磁盤路徑
string strResponse=""; //回應(yīng)響應(yīng)緩沖區(qū)
string strMsg=""; //格式化響應(yīng)信息
byte[] bs; //輸出字節(jié)緩沖區(qū)

while(bSvcRunning)
{
Socket sck=mytcp.AcceptSocket(); //每個(gè)請(qǐng)求到來
if(sck.Connected)
{
Console.WriteLine("Client {0} connected!",sck.RemoteEndPoint);
byte[] bRecv=new byte[1024]; //緩沖區(qū)
int l=sck.Receive(bRecv,bRecv.Length,0);
string strBuf=Encoding.Default.GetString(bRecv); //轉(zhuǎn)換成字符串,便于分析
s=strBuf.IndexOf("HTTP",1);
string httpver=strBuf.Substring(s,8); // HTTP/1.1 之類的
strRequest=strBuf.Substring(0,s-1);
strRequest.Replace("\\","/");
if((strRequest.IndexOf(".")<1) && (!strRequest.EndsWith("/")))
{
strRequest += "/";
}
s=strRequest.LastIndexOf("/")+1;
strRequestFile = strRequest.Substring(s); strDir=strRequest.Substring(strRequest.IndexOf("/"),strRequest.LastIndexOf("/")-3); //取得訪問的URL
if(strDir=="/")
{
strRealDir=strWebRoot;
}
else
{
strDir=strDir.Replace("/","\\");
strRealDir=strWebRoot + strDir;
}
Console.WriteLine("Client request dir: {0}" , strRealDir);
if(strRequestFile.Length==0)
{
strRequestFile="default.htm"; //缺省文檔
}
int iTotlaBytes=0; //總計(jì)需要輸出的字節(jié)
strResponse=""; //輸出內(nèi)容
strRealFile = strRealDir +"\\"+ strRequestFile;
if(strRealFile.EndsWith(".ASPx")) //這里有Bug!!
{
string output="";
//注意我下面的語句們給host對(duì)象ProcessRequest方法傳遞了一個(gè)ref類型的參數(shù),
//ASPnetHost會(huì)從ASP.NET的執(zhí)行應(yīng)用程序域執(zhí)行一個(gè)請(qǐng)求后返回流給當(dāng)前web server所在的域,這實(shí)際上發(fā)生了一個(gè)域間的調(diào)用
ASPnetHost.ProcessRequest (strRequestFile, ref output);//轉(zhuǎn)換成字節(jié)流
bs=System.Text.Encoding.Default.GetBytes (output);
iTotlaBytes=bs.Length ; //調(diào)用套接字將執(zhí)行結(jié)果返回
WriteHeader(httpver,"text/html",iTotlaBytes,"200 OK",ref sck);
FlushBuf(bs,ref sck);
}
else
{try
{
fs=new FileStream( strRealFile,FileMode.Open,FileAccess.Read,FileShare.Read );
BinaryReader reader=new BinaryReader(fs); //讀取
bs=new byte[fs.Length ];
int rb;
while((rb=reader.Read(bs,0,bs.Length ))!=0)
{
strResponse =strResponse +Encoding.Default.GetString(bs,0,rb);
iTotlaBytes =iTotlaBytes+rb;
}
reader.Close();
fs.Close();
WriteHeader(httpver,"text/html",iTotlaBytes,"200 OK",ref sck);
FlushBuf(bs,ref sck);
}
catch(System.IO.FileNotFoundException )
{//假設(shè)找不到文件,報(bào)告404 WriteHeader(httpver,"text/html",iTotlaBytes,"404 OK",ref sck);
}
}
}
sck.Close(); //Http請(qǐng)求結(jié)束
}
}

// WriteHeader想客戶端發(fā)送HTTP頭
public void WriteHeader(string ver,string mime,int len,string statucode,ref Socket sck) {
string buf="";

if(mime.Length ==0)
{
mime="text/html";

buf=buf+ver+ statucode + "\r\n";
buf=buf+"Server:MyIIS"+"\r\n";
buf=buf+"Content-Type:"+mime +"\r\n";
buf=buf+"Accept-Rabges:bytes"+"\r\n";
buf=buf+"Content-Length:"+ len +"\r\n\r\n";
byte[] bs=Encoding.Default.GetBytes(buf);
FlushBuf(bs,ref sck);
}
}

// FlushBuf刷新向客戶發(fā)送信息緩沖區(qū)
public void FlushBuf(byte[] bs,ref Socket sck)
{
int iNum=0;
try
{
if(sck.Connected)
{
if((iNum=sck.Send(bs,bs.Length ,0))==-1)
{
Console.WriteLine("Flush Err:Send Data err");
}
else
{
Console.WriteLine("Send bytes :{0}",iNum);
}
}
else
{
Console.WriteLine("Client diconnectioned!");
}
}
catch(Exception e)
{
Console.WriteLine("Error:{0}",e);
}
}
}

// ASPDOTNETHost類實(shí)例需要跨越兩個(gè)應(yīng)用程序域,所以繼承自MarshalByRefObject
class ASPDOTNETHost:MarshalByRefObject
{
public void ProcessRequest( string fileName ,ref string output)
{
MemoryStream ms=new MemoryStream(); //內(nèi)存流,當(dāng)然為了速度
StreamWriter sw = new StreamWriter(ms); //輸出
sw.AutoFlush = true; //設(shè)為自動(dòng)刷新 /先構(gòu)造一個(gè)HttpWorkRequest請(qǐng)求類,以便ASP.NET能夠分析獲取請(qǐng)求信息,同時(shí)傳入一個(gè)輸出流對(duì)象供ASP.NET執(zhí)行期間返回html流
HttpWorkerRequest worker = new SimpleWorkerRequest( fileName, "" ,sw) ; // 調(diào)度某個(gè)頁,這里面的包含很多細(xì)節(jié),后面分析
HttpRuntime.ProcessRequest( worker ) ;
StreamReader sr= new StreamReader(ms); //準(zhǔn)備從內(nèi)存流中讀取
ms.Position =0; //移動(dòng)指針到頭
output = sr.ReadToEnd();
}
}
}
HttpRuntime.ProcessRequest( worker ) ;包括了那些細(xì)節(jié)呢?大體上如下:
1、首先,worker對(duì)象傳入給ASP.NET的應(yīng)用程序域,告知發(fā)生了對(duì)于哪一個(gè)ASPx文件的請(qǐng)求,以及當(dāng)前目錄是什么,如果在執(zhí)行期間發(fā)生的輸出內(nèi)容應(yīng)該寫到哪里(sw對(duì)象)。這發(fā)生一個(gè)由web server當(dāng)前應(yīng)用程序域到我們自己建立的ASP.NET應(yīng)用程序域的跨(應(yīng)用程序)域調(diào)用,還可能由于是第一次訪問,會(huì)發(fā)生了全局事件、或者session事件等。
2、ASP.NET的應(yīng)用程序域會(huì)檢測(cè)請(qǐng)求的ASPx文件是否存在,不存在,就報(bào)錯(cuò);如果存在還要看看代碼緩存中是否存在上次編譯的代碼,如果存在且ASP.NET檢測(cè)到不需要重新編譯,會(huì)直接執(zhí)行緩存中的代碼;如果不存在或者代碼過期需要重新編譯,就需要讀取ASPx文件,編譯成.NET的代碼,存入緩存。可能有些頁存在代碼和模板分離成多個(gè)文件,甚至包括一些資源文件,這些都需要讀取后編譯成.NET的虛擬機(jī)代碼,然后在托管環(huán)境里執(zhí)行。
3、執(zhí)行ASP.NET的編譯代碼緩存中的代碼,輸出數(shù)據(jù)利用sw對(duì)象輸出。
當(dāng)然,根據(jù)不同的配置,還有很多方法的調(diào)用/事件的發(fā)生等細(xì)節(jié)不同。
如何調(diào)試運(yùn)行以上程序,觀察結(jié)果呢?
建立一個(gè)控制臺(tái)類型工程,將上述代碼錄入后編譯,將得到的程序拷貝在作為站點(diǎn)應(yīng)用起始目錄(譬如c:\inetpub\wwwroot\myweb)的bin子目錄下,然后啟動(dòng),這樣在其中創(chuàng)建ASP.NET應(yīng)用程序域才不會(huì)因?yàn)槌绦蚣虞d失敗而出錯(cuò)。建立一個(gè)asp.net工程在目錄下,添加default.htm文件和測(cè)試用的test.aspx,加入.NET執(zhí)行代碼,然后啟動(dòng)IE,在地址欄分別輸入:http://127.0.0.1:8001/default.htm http://127.0.0.1:8001/test.aspx感受一下執(zhí)行過程。甚至你可以建立的工程中設(shè)定斷點(diǎn)之類,仔細(xì)調(diào)試和觀察其中的細(xì)節(jié)。親手試一試吧,一定有收獲的!

四、 自己構(gòu)造ASP.NET宿主的意義
費(fèi)了半天勁搞自己的ASP.NET宿主,對(duì)于我們有何意義呢?
首先,是大致從代碼級(jí)清楚分析ASP.NET執(zhí)行細(xì)節(jié),自己學(xué)習(xí)了解執(zhí)行細(xì)節(jié),除了可以在出現(xiàn)ASP.NET故障可以進(jìn)行精確定位和排除外,還可以幫助我們?cè)趯慉SP.NET應(yīng)用程序時(shí)寫出更有效率和健壯的代碼。
其次,我們可以提供一個(gè)思路,可以將我們的ASP.NET程序運(yùn)行于低配置機(jī)器上,脫離IIS。ASP.NET的“原配”宿主IIS需要運(yùn)行在Server OS上,要知道在安全專家眼中,IIS可是大隱患的源頭之一。我們可以將很多傳統(tǒng)程序利用ASP.NET編寫,但脫離IIS獨(dú)立執(zhí)行,譬如在win98系統(tǒng)上執(zhí)行ASP.NET。web server和ASP.NET都在托管環(huán)境中執(zhí)行,相比較ISAPI建立宿主然后執(zhí)行,除提高效率外,還可以使用.NET平臺(tái)提供的豐富管理調(diào)控功能,寫B(tài)/S程序更接近傳統(tǒng)程序編寫方式,這對(duì)于程序員來講都是效率(編寫代碼的效率和執(zhí)行效果效率)的保證。
另外,對(duì)于采用ASP.NET做的項(xiàng)目,大家可以很方便進(jìn)行開發(fā)調(diào)試、運(yùn)行維護(hù)、安裝。即使是普通桌面程序,我們也可以通過類似制作網(wǎng)頁的方式編寫這些界面和代碼,然后獨(dú)立建立類似本例中的Host環(huán)境,根據(jù)用戶交互請(qǐng)求加載執(zhí)行某些頁面,然后將界面在客戶端通過相關(guān)組件顯示出來。你可以通過此獲得ASP.NET的即時(shí)編譯功能和ASP.NET宿主托管環(huán)境,大量可自由使用的API,便于開發(fā)、安裝、維護(hù)。畢竟,托管環(huán)境幾乎準(zhǔn)備了您需要的一切功能。

五、 參考資料
1、.NET MSDN
2、清華大學(xué)出版社《.NET網(wǎng)絡(luò)高級(jí)編程》Andrew Krowczyk Viond Kumar原著
3、清華大學(xué)出版社《.NET框架程序設(shè)計(jì)(修訂版)》Jsfftry Richter著

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 中文字幕 欧美日韩| 色国产在线视频| 日本一区二区免费高清视频| 国产91色在线观看| 99久久激情视频| 欧美色图另类小说| 国产精品沙发午睡系列| 日韩少妇内射免费播放18禁裸乳| www.在线观看av| 国产91沈先生在线播放| 无码日本精品xxxxxxxxx| av日韩在线看| 亚洲国产精品无码av| 国产一区 在线播放| 国产在线播放观看| 波多野结衣家庭教师在线| 18禁免费无码无遮挡不卡网站 | 99热手机在线| 五月天激情播播| 特黄特黄一级片| 2018中文字幕第一页| 久久久999视频| 中文久久久久久| 国产成人强伦免费视频网站| 熟女熟妇伦久久影院毛片一区二区| 女女同性女同一区二区三区按摩| 热久久最新网址| 国产特级黄色大片| www.xxx亚洲| 九九九九九九九九| 国产精品久久久久9999爆乳| 丰满爆乳一区二区三区| 青青草av网站| 黄色录像特级片| 国模吧无码一区二区三区| www.com黄色片| 国产高清www| 北条麻妃在线视频| 2021狠狠干| 欧美自拍小视频| 欧美成人精品免费| 欧美日韩一区二区三区69堂| 国产精品国产三级国产专区51| 日韩 欧美 高清| av动漫在线免费观看| 精品www久久久久奶水| 男插女免费视频| 一区二区三区国产免费| 国产成人一二三区| 麻豆三级在线观看| 波多野结衣之无限发射| 日本成人性视频| 在线观看免费视频高清游戏推荐 | 91av在线免费播放| 超薄肉色丝袜足j调教99| 国产女女做受ⅹxx高潮| 免费极品av一视觉盛宴| www.五月天色| 老司机久久精品| 欧美伦理视频在线观看| 国产亚洲综合视频| 亚洲人精品午夜射精日韩| 超碰成人在线免费观看| 伊人影院综合在线| www.com操| 一道本视频在线观看| 国产福利一区视频| 激情六月丁香婷婷| 国产精品免费成人| 久久久久久久久久福利| 亚洲国产精品毛片av不卡在线| 免费av手机在线观看| 成人黄色大片网站| 欧美a v在线播放| aa在线免费观看| 116极品美女午夜一级| 黄色动漫网站入口| 久久黄色免费看| 日韩av一卡二卡三卡| 日韩av在线综合| 日日躁夜夜躁aaaabbbb| 在线免费av播放| 伊人色在线观看| 只有这里有精品| www.av毛片| 2018国产在线| 久久9精品区-无套内射无码| chinese少妇国语对白| 伊人影院综合在线| 国产欧美久久久久| 日韩精品一区二区三区色欲av| 国内自拍视频网| 日本女人高潮视频| 久久黄色片视频| 在线观看免费视频高清游戏推荐| 免费不卡av网站| 欧美爱爱视频免费看| 精品999在线| av影院在线播放| 成人午夜激情av| 日本高清xxxx| 黄色一级一级片| 最新av在线免费观看| 欧美日韩中文在线视频| 精品国产乱码久久久久久1区二区| 国产九色porny| 99日在线视频| 久久久久久久久久久视频| 午夜免费一级片| 韩国中文字幕av| 少妇av一区二区三区无码| 亚洲黄色片免费看| 国产又大又硬又粗| 国产一级做a爰片久久毛片男| 麻豆一区二区三区视频| 女人帮男人橹视频播放| 九九九九九国产| 91av俱乐部| 国产免费黄色小视频| 天天成人综合网| 在线观看国产一级片| 黄色a级片免费| 亚洲精品久久久久久久蜜桃臀| 中文字幕在线视频精品| 能看的毛片网站| 亚洲色欲综合一区二区三区| 男人插女人视频在线观看| 日本福利视频导航| www.com久久久| 免费看涩涩视频| 91极品尤物在线播放国产| 美女福利视频在线| 美女av免费在线观看| 玩弄中年熟妇正在播放| 精品国产av无码一区二区三区| 国产a级黄色大片| 日韩不卡一二区| 97超碰免费观看| 台湾无码一区二区| av日韩一区二区三区| 丰满的少妇愉情hd高清果冻传媒| 日本高清视频免费在线观看| 青青草免费在线视频观看| 日韩精品久久一区二区| 国产曰肥老太婆无遮挡| 91专区在线观看| 日本三级免费观看| 午夜视频你懂的| 亚洲第一成肉网| 特级西西人体www高清大胆| 国产精品日韩三级| 国产a级片网站| 国产三级三级三级看三级| 91精品无人成人www| 在线视频一二三区| 欧美男女爱爱视频| www.色就是色| 四虎成人在线播放| 六月婷婷在线视频| www.天天射.com| 青青视频免费在线观看| 和岳每晚弄的高潮嗷嗷叫视频| 日韩av播放器| 国产又粗又硬又长| 国产a级片免费观看| 中文字幕第50页| 欧美牲交a欧美牲交aⅴ免费真| 国内自拍第二页| 高清在线观看免费| 三级一区二区三区| 久久久久久久久久久99| 一本色道久久亚洲综合精品蜜桃| 国产精品h视频| 中文字幕视频在线免费观看| 国产精品一二三在线观看| 粗暴91大变态调教| 日韩一级片免费视频| 97超碰人人爽| 嫩草av久久伊人妇女超级a| 妞干网这里只有精品| 中文字幕在线导航| 成人免费观看在线| 欧美aaa在线观看| 另类小说第一页| 国产手机免费视频| 天堂av免费看| 亚洲免费在线播放视频| 亚洲人成无码www久久久| 国产av国片精品| 老司机激情视频| 欧美xxxx吸乳| 中文字幕制服丝袜在线| 伊人成人222| 天天综合网久久| 日本国产一级片| 日韩肉感妇bbwbbwbbw| 红桃av在线播放| 欧美伦理片在线看| 91看片就是不一样| 国产a级片免费观看|