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

首頁 > 學院 > 編程設計 > 正文

ASP.NET架構及開發技術詳細講解教程

2020-07-14 13:29:21
字體:
來源:轉載
供稿:網友

首先我們來說一下Asp.net工作原理。

具體描述下這樣的:首先客戶請求WEB頁。然后WEB服務尋找指令文件(.aspx),而這時就是aspnet_isapi.dll這個動態連接庫來處理。接著Asp.net代碼被發送到公共語言運行時進行編譯。接著HTML流返回給瀏覽器和令。最后由瀏覽器處理HTML并顯示頁面。

什么是ISAPI呢?

在Internet時代的開端,客戶端的需求非常有限;.htm文件就可以滿足他們的需求。但是,隨著時間的流逝,客戶端需求的擴充超越了.htm文件或靜態文件所包含的功能。
開發者需要擴充或擴展Web服務器的功能。Web服務器廠商設計了不同的解決方案,但是都遵循同一個主題“向Web服務器插入某些組件”。所有的Web服務器補充技術都允許開發者建立并插入組件以增強Web服務器的功能。微軟公司提出了ISAPI(Internet服務器API),網景公司提出了 NSAPI(網景服務器API)等等。ISAPI是一種重要的技術,它允許我們增強與ISAPI兼容的Web服務器(IIS就是一種與ISAPI兼容的 Web服務器)的能力。我們使用下面的組件達到這個目的:

1,ISAPI擴展:ISAPI擴展是使用Win32動態鏈接庫來實現的。你可以把ISAPI擴展看作是一個普通的應用程序。ISAPI擴展的處理目標是http請求。
2,ISAPI過濾器:客戶端每次向服務器發出請求的時候,請求要經過過濾器??蛻舳瞬恍枰谡埱笾兄付ㄟ^濾器,只需要簡單地把請求發送給Web服務器,接著Web服務器把請求傳遞給相關的過濾器。接下來過濾器可能修改請求,執行某些登錄操作等等。

ASP.NET請求的處理過程:

ASP.NET請求處理過程是基于管道模型的,在模型中ASP.NET把http請求傳遞給管道中的所有模塊。每個模塊都接收http請求并有完全控制權限。模塊可以用任何自認為適合的方式來處理請求。一旦請求經過了所有HTTP模塊,就最終被HTTP處理程序處理。HTTP處理程序對請求進行一些處理,并且結果將再次經過管道中HTTP模塊。

ISAPI的篩選器:

IIS本身是不支持動態頁面的,也就是說它僅僅支持靜態html頁面的內容,對于如.asp,.aspx,.cgi,.php等,IIS并不會處理這些標記,它就會把它當作文本,絲毫不做處理發送到客戶端。為了解決這個問題。IIS有一種機制,叫做ISAPI的篩選器,它是一個標準組件(COM組件)。

Asp.net服務在注冊到IIS的時候,會把每個擴展可以處理的文件擴展名注冊到IIS里面(如:*.ascx、*.aspx等)。擴展啟動后,就根據定義好的方式來處理IIS所不能處理的文件,然后把控制權跳轉到專門處理代碼的進程中讓這個進程開始處理代碼,生成標準的HTML代碼,生成后把這些代碼加入到原有的Html中,最后把完整的Html返回給IIS,IIS再把內容發送到客戶端。

HttpModule:

HttpModule實現了ISAPI Filter的功能,是通過對IhttpModule接口的繼承來處理。
HTTP模塊是實現了System.Web.IhttpModule接口的.NET組件。這些組件通過在某些事件中注冊自身,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對請求有興趣的HTTP模塊,這樣該模塊就能處理請求了。

HttpModule的實現:
1. 編寫一個類,實現IhttpModule接口。
2. 實現Init 方法,并且注冊需要的方法。
3. 實現注冊的方法。
4. 實現Dispose方法,如果需要手工為類做一些清除工作,可以添加Dispose方法的實現,但這不是必需的,通??梢圆粸镈ispose方法添加任何代碼。
5. 在Web.config文件中,注冊您編寫的類。
下邊我們來看例子,HttpModule的實現:
首先添加一個類庫,然后在引用里引用System.Web和System.Security這兩個命名空間。然后寫個類,代碼如下:


復制代碼
代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Security.Principal;
namespace Httplibrary
{
public class SecurityModules:IHttpModule
{
public void Init(HttpApplication r_objApplication)
  {
// 向Application 對象注冊事件處理程序,核心部分。
r_objApplication.AuthenticateRequest += new EventHandler(this.AuthenticateRequest) ;
  }
  public void Dispose()
  {
   
  }
  private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs)
  {
// 鑒別用戶的憑證,并找出用戶角色。
HttpApplication objApp = (HttpApplication) r_objSender ;
HttpContext objContext = (HttpContext) objApp.Context ;
if ( (objApp.Request["userid"] == null) ||(objApp.Request["password"] == null) )
{
objContext.Response.Write("用戶名和密碼為空,驗證失?。?) ;
objContext.Response.End() ;
}
string userid = "" ;
userid = objApp.Request["userid"].ToString() ;
string password = "" ;
password = objApp.Request["password"].ToString() ;
string[] strRoles ;
strRoles = AuthenticateAndGetRoles(userid, password) ;
if ((strRoles == null) || (strRoles.GetLength(0) == 0))
{
objContext.Response.Write("用戶名或密碼錯誤!") ;
objApp.CompleteRequest() ;//終止一個Http請求 </p><p>}
GenericIdentity objIdentity = new GenericIdentity(userid,"CustomAuthentication") ;
objContext.User = new GenericPrincipal(objIdentity, strRoles) ;
}
private string[] AuthenticateAndGetRoles(string r_strUserID,string r_strPassword)
{
string[] strRoles = null ;
if ((r_strUserID.Equals("Zhangsan")) && (r_strPassword.Equals("111")))
{
strRoles = new String[1] ;
strRoles[0] = "Administrator" ;
}
else if ((r_strUserID.Equals("Lisi")) && (r_strPassword.Equals("222")))
{
strRoles = new string[1] ;
strRoles[0] = "User" ;
}
return strRoles ;
  }
}
}


編譯一下,下邊做測試頁面,很簡單,放一個label,text=“測試頁面”如果成功則顯示測試頁面。然后在web.config里面配置,這里很重要。添加 注意注釋部分。


復制代碼
代碼如下:

<httpModules>
<!--注意我這里的Httplibrary是你添加引用的那個DLL的文件名.Httplibrary.SecurityModules
中前邊部分是你那個類的名稱空間,后邊的是你建的類的名字。-->
<add name=" Test1 " type="Httplibrary.SecurityModules,Httplibrary"/>
</httpModules>
然后添加 這個節點,這個大家應該都能明白。
<authorization>
<deny users="?"/>
</authorization>


然后啟動測試頁面。剛啟動開始后頁面一定顯示“用戶名和密碼為空,驗證失?。?rdquo;呵呵,別忘記了咱們這就是目的,然后在你的地址欄后邊添加?userid= Zhangsan&password=111這行字。然后就會顯示“測試頁面”這幾個字。大家可以多輸入幾個名字單步調試一下就明白了。

WebConfig設置


復制代碼
代碼如下:

<httpModules>
<add type=“classname,assemblyname”
name=“modulename”/>
<remove name=“modulename”/>
<clear/>
</httpModules>


子標記說明:

<add>將HttpModule 類添加到應用程序。請注意,如果以前已指定了相同的謂詞/路徑組合(例如在父目錄的Web.config 文件中),則對的第二個調用將重寫以前的設置。
<remove>從應用程序移除HttpModule 類。
<clear>從應用程序移除所有HttpModule 映射。

深入研究HttpModule

HttpModule通過對HttpApplication對象的一系列事件的處理來對HTTP處理管道施加影響,這些事件在HttpModule的Init方法中進行注冊,包括:

BeginRequest
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest

我們都可以對以上事件進行重新定義,注意時重新定義不時覆蓋。我們看一個例子,多個HttpModule的實現,建立兩個類庫,什么都相同就是類名不相同,引入相應的命名空間后我們編寫這個類,代碼如下:


復制代碼
代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace HttpModuleTest1
{
public class Test1Module:IHttpModule
{
public Test1Module()
{
}
public string ModuleName
{
get
{
return "Test1Module";
}
}
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(myBeginRequest);
application.EndRequest += new EventHandler(myEndRequest);
application.PreRequestHandlerExecute += new EventHandler(myPreRequestHandlerExecute);
application.PostRequestHandlerExecute += new EventHandler(myPostRequestHandlerExecute);
application.ReleaseRequestState += new EventHandler(myReleaseRequestState);
application.AcquireRequestState += new EventHandler(myAcquireRequestState);
application.AuthenticateRequest += new EventHandler(myAuthenticateRequest);
application.AuthorizeRequest += new EventHandler(myAuthorizeRequest);
application.ResolveRequestCache += new EventHandler(myResolveRequestCache);
application.PreSendRequestHeaders += new EventHandler(myPreSendRequestHeaders);
application.PreSendRequestContent += new EventHandler(myPreSendRequestContent);
}
private void myBeginRequest(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Beggining of Request
");
}
private void myEndRequest(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:End of Request
");
}
private void myPreRequestHandlerExecute(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_RequestHandlerExecute:
");
}
private void myPostRequestHandlerExecute(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_PostRequestHandlerExecute:
");
}
private void myReleaseRequestState(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_ReleaseRequestState:
");
}
private void myAcquireRequestState(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_ReleaseRequestState:
");
}
private void myAuthenticateRequest(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_AuthenticateRequest:
");
}
private void myAuthorizeRequest(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_AuthorizeRequest:
");
}
private void myResolveRequestCache(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_ResolveRequestCache:
");
}
private void myPreSendRequestHeaders(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_PreSendRequestHeaders:
");
}
private void myPreSendRequestContent(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("Test1Module:Application_PreSendRequestContent:
");
}
public void Dispose()
{
}
}
}


然后在web.config里添加,不明白的看注釋部分。


復制代碼
代碼如下:

<httpModules>
<!--注意我這里的Httplibrary是你添加引用的那個DLL的文件名.Httplibrary.SecurityModules
中前邊部分是你那個類的名稱空間,后邊的是你建的類的名字。-->
<add name=" Test1 " type="Httplibrary.SecurityModules,Httplibrary"/>
<add name=" MultiTest1 " type="HttpModuleTest1.Test1Module, HttpModuleTest1" />
<add name=" MultiTest2" type="HttpModuleTest2.Test2Module, HttpModuleTest2" />
</httpModules>


還是用剛才那個測試頁面,我們就可以觀察到兩個test的執行順序。
我們具體分析一下就是這樣的:

HttpRequest開始->進入HttpModule->HttpModule->
首次截獲HttpRequest->HttpModule.BeginRequest->
HttpModule.AuthorizeRequest->HttpModule.ResolveRequestCache->
初始化HttpHandler->建立HttpHandler控制點->HttpModule繼續處理。HttpHandler已經建立,此后Session可用->HttpModule.AcquireRequestState
->HttpModule.PreRequestHandlerExecute->進入HttpHandler處理HttpRequest
->HttpHandler->HttpHandler.ProcessRequest->返回HttpModule, HttpHandler結束,Session失效->HttpModule.PostRequestHandlerExecute-> HttpModule.ReleaseRequestState->
HttpModule.UpdateRequestCache->HttpModule.EndRequest->HttpModule.PreSendRequestHeaders->HttpModule.PreSendRequestContent->
將處理的數據返回客戶端,處理結束。

HttpHandler:
HttpHandler實現了ISAPI Extention的功能,他處理請求(Request)的信息和發送響應(Response)。HttpHandler功能的實現通過實現IHttpHandler接口來達到。
HTTP處理程序是實現了System.Web.IHttpHandler接口的.NET組件。任何實現了IHttpHandler接口的類都可以用于處理輸入的HTTP請求。HTTP處理程序與ISAPI擴展有些類似。HTTP處理程序和ISAPI擴展的差別在于在URL中可以使用HTTP處理程序的文件名稱直接調用它們,與ISAPI擴展類似。
HttpHandler的實現,實現我們的HTTP處理程序包含以下步驟:
編寫一個實現IHttpHandler接口的類。
在web.config或machine.config文件中注冊這個處理程序。
在Internet服務管理器中把文件擴展(你想要處理的文件擴展名)映射到ASP.NETISAPI擴展DLL(aspnet_isapi.dll)上。

我們來看一個例子,打開IIS服務器,屬性,主目錄下有個配置,里面你就可以找到你的程序所執行文件所要調用的.dll文件。我們可以看到.aspx就是 C:WINDOWSMicrosoft.NETFramework 2.0.50727aspnet_isapi.dll這個文件
來執行的。這里還可以添加你自己任意定義任意擴展名文件,定義了后你的服務器就可以認識這些人間,注意只是你的服務器,別人的不認識。這時候大家就會對網絡上流行的各式各樣的后綴名不奇怪了吧,可以自己定義的。
我們自己定義一個帶.xxx后綴的。
添加一個類庫,引用的相應的命名空間,


復制代碼
代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace MyHandler
{
public class NewHandler:IHttpHandler
{
public NewHandler()
{
// TODO: 此處添加構造邏輯
}
Implementation of IHttpHandler#region Implementation of IHttpHandler
/**//// <summary>
/// http處理程序的核心。我們調用這個方法來處理http請求。
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(System.Web.HttpContext context)
{
HttpResponse objResponse = context.Response;
objResponse.Write("<html><body><h1>Hello xxx ! ");
objResponse.Write("</body></html>");
}
/**//// <summary>
/// 我們調用這個屬性來決定http處理程序的實例是否可以用于處理相同其它類型的請求。
/// HTTP處理程序可以返回true或false來表明它們是否可以重復使用。
/// </summary>
public bool IsReusable
//
{
get
{
return true;
}
}
#endregion
}
}


然后再web.config里面配置相應節點:這里不懂的參考前邊的,XXX就是我們剛才定義那個后綴名。
<httpHandlers>
<add verb="*" path="*.xxx"
type="MyHandler.NewHandler,MyHandler" />
</httpHandlers>
然后添加一個測試頁面,就可以了。
HttpHandler之間的關系是這樣的:
發送一個Http請求,然后判斷是否存在自定義的HttpHandler,如果存在的話由自定義的HttpHandler處理Http請求,否則由系統默認的HttpHandler處理Http請求。
在HttpHandler中訪問Session:
不能直接通過HttpContext訪問。
必須實現IRequiresSessionState接口。
IRequiresSessionState接口指定目標HTTP處理程序接口具有對會話狀態值的讀寫訪問權限。這是一個標記接口,沒有任何方法。
怎樣實現呢,我們還是來看例子吧:添加類庫,引用相應的命名空間。


復制代碼
代碼如下:

using System;
using System.Web;
using System.Web.SessionState;
namespace MyHandler
{
public class NewHandlerSession : IHttpHandler,IRequiresSessionState
{
public NewHandlerSession()
{
// TODO: 此處添加構造邏輯
}
Implementation of IHttpHandler#region Implementation of IHttpHandler
/**//// <summary>
/// http處理程序的核心。我們調用這個方法來處理http請求。
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(System.Web.HttpContext context)
{
HttpResponse objResponse = context.Response ;
HttpRequest objRequest = context.Request;
HttpSessionState objSession = context.Session;
objResponse.Write("歡迎使用自定義HttpHandler!
");
objSession["Test"] = "Session 測試!
";
objResponse.Write("Session的值為:"+objSession["Test"].ToString());
}
/**//// <summary>
/// 我們調用這個屬性來決定http處理程序的實例是否可以用于處理相同其它類型的請求。
/// HTTP處理程序可以返回true或false來表明它們是否可以重復使用。
/// </summary>
public bool IsReusable
//
{
get
{
return true;
}
}
#endregion
}
}

然后配置Web.config的節點:


復制代碼
代碼如下:

<httpHandlers>
<!--<add verb="*" path="*.xxx"
type="MyHandler.NewHandler,MyHandler" />-->
<add verb="*" path="*"
type="MyHandler.NewHandlerSession,MyHandlerSession" />
</httpHandlers>


這樣就可以了。
ASP.NET事件模型機制:
ASP.NET之所以對于以前的ASP是一個革命性的巨變,在很大程度上是由于ASP.NET技術是一種完全基于事件驅動的全新技術。
在ASP.NET中事件的觸發和處理分別是在客戶端和服務器段進行的。
ASP.NET中,如果頻繁和服務器進行事件信息的傳遞,會大大降低服務器的處理效率和性能,因而有些事件如OnMouseOver沒有提供。
但提供了Change事件。為了提高效率它們被緩存在客戶端。等到再一次事件信息被發送到服務器端時一同發送回去。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成在线观看| 中文字幕在线日韩| 中日韩午夜理伦电影免费| 日韩电影中文字幕一区| 亚洲成人久久一区| 亚洲性生活视频在线观看| 亚洲午夜精品久久久久久久久久久久| 亚洲男人的天堂在线| zzijzzij亚洲日本成熟少妇| 久久99国产综合精品女同| 久久成人精品视频| 欧美日韩ab片| 奇米影视亚洲狠狠色| 久久久91精品国产一区不卡| 亚洲欧美综合精品久久成人| 久久久久久久久亚洲| 久久乐国产精品| 国产精品久久久久久久久久久久久久| 97在线视频免费看| 亚洲午夜av久久乱码| 7m精品福利视频导航| 91久久国产精品91久久性色| 激情久久av一区av二区av三区| 日韩在线欧美在线国产在线| 亚洲精品美女网站| 欧美性猛交xxxx免费看久久久| 色av中文字幕一区| 精品日本美女福利在线观看| 97香蕉超级碰碰久久免费的优势| 最新69国产成人精品视频免费| 亚洲国产精品久久久| 欧美日本高清视频| 26uuu日韩精品一区二区| 精品久久久久久亚洲精品| 久久精品免费播放| 国产视频在线观看一区二区| 久久精品久久久久电影| 精品亚洲一区二区| 亚洲综合中文字幕在线| 欧美日韩在线第一页| 亚洲国产精彩中文乱码av在线播放| 国产精品大陆在线观看| 91香蕉亚洲精品| 97av在线视频| 欧美激情国产日韩精品一区18| 久久久久久999| 午夜欧美不卡精品aaaaa| 亚洲丁香婷深爱综合| 青草成人免费视频| 成人免费淫片aa视频免费| 亚洲成人精品久久| 久久精品国产96久久久香蕉| 91精品国产高清自在线| 国产亚洲一级高清| 欧美亚洲第一页| 91免费版网站入口| 色综合久久天天综线观看| 欧美午夜视频在线观看| 日韩成人久久久| 成人福利视频网| 欧美午夜激情视频| 国产精品美女久久久久av超清| 国产在线视频一区| 精品视频久久久久久| 亚洲欧美国产制服动漫| 亚洲欧美日韩在线一区| zzjj国产精品一区二区| 欧美视频一区二区三区…| 91在线高清视频| 91av在线视频观看| 亚洲毛片在线观看.| 国产精品偷伦免费视频观看的| 国产精品美女免费视频| 欧美日韩亚洲成人| 在线亚洲国产精品网| 亚洲国产成人在线视频| 欧美日韩在线影院| 美女av一区二区| 91精品国产自产在线老师啪| 久久久久久久久国产精品| 69**夜色精品国产69乱| 91精品国产自产在线观看永久| 国产午夜精品久久久| 一二美女精品欧洲| xxxxx91麻豆| 国产精品日韩在线| 538国产精品视频一区二区| 久久视频国产精品免费视频在线| 亚洲深夜福利在线| 国产香蕉97碰碰久久人人| xxx成人少妇69| 亚洲最大av网站| 亚洲精品中文字幕女同| 亚洲国语精品自产拍在线观看| 亚洲国产精品一区二区久| 亚洲国产精品一区二区久| 日韩免费观看av| 欧美日韩中国免费专区在线看| www.亚洲免费视频| 久久综合久久八八| 一区二区国产精品视频| 国产成人综合久久| 国产mv免费观看入口亚洲| 中文字幕v亚洲ⅴv天堂| 26uuu另类亚洲欧美日本老年| 国产视频亚洲视频| 久久精彩免费视频| 亚洲午夜激情免费视频| 日韩中文字幕在线视频| 精品久久久久国产| 久久国产精彩视频| 久久人91精品久久久久久不卡| 国外成人在线播放| 成人a视频在线观看| 亚洲欧美成人一区二区在线电影| 国产视频精品va久久久久久| 在线播放精品一区二区三区| 日韩中文综合网| 亚洲最大的av网站| 久久香蕉频线观| 精品国产自在精品国产浪潮| 色综合色综合久久综合频道88| 少妇高潮久久久久久潘金莲| 成人精品视频99在线观看免费| 91美女高潮出水| 91精品久久久久久久久久另类| 欧美日韩一区二区在线| 26uuu日韩精品一区二区| 国产午夜一区二区| 九九精品在线播放| 欧美成人久久久| 国产亚洲aⅴaaaaaa毛片| 亚洲影院色无极综合| 激情成人在线视频| 亚洲精品丝袜日韩| 亚洲成年网站在线观看| 国产一区二区丝袜高跟鞋图片| 国产精品久久久久高潮| 亚洲国产精品系列| 欧美高跟鞋交xxxxhd| 国产精品黄视频| 日韩在线视频播放| 欧美日韩一区二区免费在线观看| 亚洲欧洲一区二区三区在线观看| 成人黄色影片在线| 狠狠综合久久av一区二区小说| 97视频人免费观看| 欧美精品免费看| zzjj国产精品一区二区| 亚洲一区免费网站| 91中文精品字幕在线视频| 日韩欧美有码在线| 国内精品一区二区三区四区| 国产精品久久久久久久一区探花| 欧美洲成人男女午夜视频| 精品网站999www| 国产伦精品免费视频| 91在线精品播放| 亚洲午夜激情免费视频| 中文字幕亚洲情99在线| 亚洲另类激情图| 欧美片一区二区三区| 欧美老女人性视频| 91精品国产免费久久久久久|