精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ASP.NET MVC基于異常處理的解決方案

開發(fā) 后端
本文我將通過它的擴(kuò)展實(shí)現(xiàn)與EntLib的集成,并提供一個(gè)完整的解決異常處理解決方案。

  EntLib的異常處理應(yīng)用塊(Exception Handling Application Block)是一個(gè)不錯(cuò)的異常處理框架,它使我們可以采用配置的方式來定義異常處理策略。而ASP.NET MVC是一個(gè)***可擴(kuò)展開發(fā)框架,在這篇文章中我將通過它的擴(kuò)展實(shí)現(xiàn)與EntLib的集成,并提供一個(gè)完整的解決異常處理解決方案。  

目錄

  一、基本異常處理策略

  二、通過自定義Action處理異常

  三、通過配置的Error View處理異常

  四、自定義ActionInvoker:ExceptionActionInvoker

  五、自定義Controller:BaseController

  一、基本異常處理策略

  我們首先來討論我們的解決方案具體采用的異常處理策略:

  對于執(zhí)行Controller的某個(gè)Action方法拋出的異常,我們會(huì)按照指定配置策略進(jìn)行處理。我們可以采取日志記錄、異常替換和封裝這些常用的異常處理方式;

  對于處理后的異常,如果異常處理策略規(guī)定需要將其拋出,則會(huì)自動(dòng)重定向到與異常類型匹配的出錯(cuò)頁面。我們會(huì)維護(hù)一個(gè)異常類型和Error View的匹配關(guān)系;

  對于處理后的異常,如果異常處理策略規(guī)定不需要將其拋出,則會(huì)執(zhí)行與當(dāng)前Action操作相匹配的錯(cuò)誤處理Action進(jìn)行處理。異常處理Action方法默認(rèn)采用“On{Action}Error”這樣的命名規(guī)則,而當(dāng)前上下文會(huì)與異常處理操作方法的參數(shù)進(jìn)行綁定。除次之外,我們會(huì)設(shè)置當(dāng)前ModelState的錯(cuò)誤信息;

  如果用戶不曾定義相應(yīng)的異常處理Action,依然采用“錯(cuò)誤頁面重定向”方式進(jìn)行異常處理。

  二、通過自定義Action處理異常

  為了讓讀者對上面介紹的異常處理頁面有一個(gè)深刻的理解,我們來進(jìn)行一個(gè)實(shí)例演示。該實(shí)例用于模擬用戶登錄,我們定義了如下一個(gè)只包含用戶名和密碼兩個(gè)屬性的Model:LoginInfoModel。

  1. namespaceArtech.Mvc.ExceptionHandling.Models  
  2. {  
  3. publicclassLoginInfo  
  4. {  
  5. [Display(Name ="User Name")]  
  6. [Required(ErrorMessage = "User Name is manadatory!")]  
  7. publicstringUserName { getset; }  
  8. [Display(Name = "Password")]  
  9. [DataType(DataType.Password)]  
  10. [Required(ErrorMessage = "Password is manadatory!")]  
  11. publicstringPassword { getset; }  
  12. }  

  我們定義了如下一個(gè)AccountController,它是我們自定義的BaseController的子類。AccountController在構(gòu)造的時(shí)候調(diào)用基類構(gòu)造函數(shù)指定的參數(shù)代表異常處理策略的配置名稱。SignIn方法代表用于進(jìn)行“登錄”的操作,而OnSignInError就表示該操作對應(yīng)的異常處理操作。如果在SignIn操作中拋出的異常經(jīng)過處理后無需再拋出,則會(huì)通過調(diào)用OnSignInError,而此時(shí)ModelState已經(jīng)被設(shè)置了相應(yīng)的錯(cuò)誤消息。

  1. publicclassAccountController : BaseController  
  2. {  
  3. publicAccountController()  
  4.  base("myPolicy")5:{ }  
  5. publicActionResult SignIn()  
  6. {  
  7. returnView(newLoginInfo());  
  8. }  
  9. [HttpPost]  
  10. publicActionResult SignIn(LoginInfo loginInfo)  
  11. {  
  12. if(!ModelState.IsValid)  
  13. {  
  14. returnthis.View(newLoginInfo { UserName = loginInfo.UserName });  
  15. }  
  16. if(loginInfo.UserName != "Foo")  
  17. {  
  18. thrownewInvalidUserNameException();  
  19. }  
  20. if(loginInfo.Password != "password")  
  21. {  
  22. thrownewUserNamePasswordNotMatchException();  
  23. }  
  24. ViewBag.Message = "Authentication Succeeds!";  
  25. returnthis.View(newLoginInfo { UserName = loginInfo.UserName });  
  26. }  
  27. publicActionResult OnSignInError(stringuserName)  
  28. {  
  29. returnthis.View(newLoginInfo { UserName = userName });  
  30. }  

  具體定義在SignIn操作方法中的認(rèn)證邏輯是這樣的:如果用戶名不是“Foo”則拋出InvalidUserNameException異常;如果密碼不是“password”則拋出UserNamePasswordNotMatchException異常。下面是SignIn操作對應(yīng)的View的定義:

  1. @model Artech.Mvc.ExceptionHandling.Models.LoginInfo  
  2. @{  
  3. ViewBag.Title = "SignIn";  
  4. }  
  5. @Html.ValidationSummary()  
  6. @if (ViewBag.Messages != null)  
  7. {   
  8. @ViewBag.Messages  
  9. }  
  10. @using (Html.BeginForm())  
  11. {   
  12. @Html.EditorForModel()<inputtype="submit"value="SignIn"/>  

  在AccountController初始化時(shí)指定的異常處理策略“myPolicy”定義在如下的配置中。我們專門針對SignIn操作方法拋出的InvalidUserNameException和UserNamePasswordNotMatchException進(jìn)行了處理,而ErrorMessageSettingHandler是我們自定義的異常處理器,它僅僅用于設(shè)置錯(cuò)誤消息。如下面的代碼片斷所示,如果上述的這兩種類型的異常被拋出,最終的錯(cuò)誤消息會(huì)被指定為“User name does not exist!”和“User name does not match password!”。

  1. <exceptionHandling> 
  2. <exceptionPolicies> 
  3. <addnameaddname="myPolicy"> 
  4. <exceptionTypes> 
  5. <addnameaddname="InvalidUserNameException" 
  6. type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling" 
  7. postHandlingAction="None"> 
  8. <exceptionHandlers> 
  9. <addnameaddname="ErrorMessageSettingHandler" 
  10. type="Artech.Mvc.ExceptionHandling.ErrorMessageSettingHandler, Artech.Mvc.ExceptionHandling" 
  11. errorMessage="User name does not exist!"/> 
  12. </exceptionHandlers> 
  13. </add> 
  14. <addnameaddname="UserNamePasswordNotMatchException" 
  15. type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling" 
  16. postHandlingAction="None"> 
  17. <exceptionHandlers> 
  18. <addnameaddname="ErrorMessageSettingHandler" 
  19. type="Artech.Mvc.ExceptionHandling.ErrorMessageSettingHandler, Artech.Mvc.ExceptionHandling" 
  20. errorMessage="User name does not match password!"/> 
  21. </exceptionHandlers> 
  22. </add> 
  23. </exceptionTypes> 
  24. </add> 
  25. </exceptionPolicies> 
  26. </exceptionHandling> 

  現(xiàn)在我們通過路由映射將AccountController和Sign設(shè)置為默認(rèn)Controller和Action后,開啟我們的應(yīng)用程序。在輸入錯(cuò)誤的用戶名和錯(cuò)誤明碼的情況下在ValidationSummary中將自動(dòng)得到相應(yīng)的錯(cuò)誤消息。

三、通過配置的Error View處理異常

  在上面的配置中,針對InvalidUserNameException和UserNamePasswordNotMatchException這兩種異常類型的配置策略都將PostHandlingAction屬性設(shè)置為“None”,意味著不會(huì)將原來的異常和處理后的異常進(jìn)行重新拋出。現(xiàn)在我們將該屬性設(shè)置為“ThrowNewException”,意味著我們會(huì)將處理后的異常重新拋出來。

  1. <exceptionHandling> 
  2. <exceptionPolicies> 
  3. <addnameaddname="myPolicy"> 
  4. <exceptionTypes> 
  5. <addnameaddname="InvalidUserNameException"type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"  
  6. postHandlingAction="ThrowNewException"> 
  7. ...  
  8. <addnameaddname="UserNamePasswordNotMatchException"type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"9:postHandlingAction="ThrowNewException"> 
  9. ...  
  10. </add> 
  11. </exceptionTypes> 
  12. </add> 
  13. </exceptionPolicies> 
  14. </exceptionHandling> 

  按照我們上面的異常處理策略,在這種情況下我們將采用“錯(cuò)誤頁面”的方式來進(jìn)行異常處理。也HandleErrorAttribute的處理方式類似,我們支持異常類型和Error View之間的匹配關(guān)系,而這是通過類似于如下的配置來定義的。值得一提的是,這里的異常類型是經(jīng)過處理后重新拋出的異常

  1. <exceptionHandling> 
  2. <exceptionPolicies> 
  3. <addnameaddname="myPolicy"> 
  4. <exceptionTypes> 
  5. <addnameaddname="InvalidUserNameException"type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"  
  6. postHandlingAction="ThrowNewException"> 
  7. ...  
  8. <addnameaddname="UserNamePasswordNotMatchException"type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"9:postHandlingAction="ThrowNewException"> 
  9. ...  
  10. </add> 
  11. </exceptionTypes> 
  12. </add> 
  13. </exceptionPolicies> 
  14. </exceptionHandling> 

  如上面的配置所示,我們?yōu)镮nvalidUserNameException和UserNamePasswordNotMatchException這兩種異常類型定義了不同的Error View,分別是“InvalideUserNameError”和“UserNamePasswordNotMatchError”,詳細(xì)定義如下所示:

  1. @{  
  2. Layout = null;  
  3. }  
  4. <!DOCTYPEhtml> 
  5. <html> 
  6. <head> 
  7. <title>Error</title> 
  8. </head> 
  9. <body> 
  10. <pstylepstyle="color:Red; font-weight:bold">Sorry,the user name you specify does not exist!</p> 
  11. </body> 
  12. </html> 
  13.  @{  
  14. Layout = null;  
  15. }  
  16. <!DOCTYPEhtml> 
  17. <html> 
  18. <head> 
  19. <title>Error</title> 
  20. </head> 
  21. <body> 
  22. <pstylepstyle="color:Red; font-weight:bold">Sorry, The password does not match the given user name!</p> 
  23. </body> 
  24. </html> 

  現(xiàn)在我們按照上面的方式運(yùn)行我們的程序,在分別輸入錯(cuò)誤的用戶名和密碼的情況下會(huì)自動(dòng)顯現(xiàn)相應(yīng)的錯(cuò)誤頁面。

四、自定義ActionInvoker:ExceptionActionInvoker

  對于上述的兩種不同的異常處理方式最終是通過自定義的ActionInvoker來實(shí)現(xiàn)的,我們將其命名為ExceptionActionInvoker。如下面的代碼片斷所式,ExceptionActionInvoker直接繼承自ControllerActionInvoker。屬性ExceptionPolicy是一個(gè)基于指定的異常策略名稱創(chuàng)建的ExceptionPolicyImpl 對象,用于針對EntLib進(jìn)行的異常處理。而屬性GetErrorView是一個(gè)用于獲得作為錯(cuò)誤頁面的ViewResult對象的委托。整個(gè)異常處理的核心定義在InvokeAction方法中,該方法中指定的handleErrorActionName參數(shù)代表的是“異常處理操作名稱”,整個(gè)方法就是按照上述的異常處理策略實(shí)現(xiàn)的。

 

  1. usingSystem;  
  2. usingSystem.Collections.Generic;  
  3. usingSystem.Linq;  
  4. usingSystem.Web;  
  5. usingSystem.Web.Mvc;  
  6. usingArtech.Mvc.ExceptionHandling.Configuration;  
  7. usingMicrosoft.Practices.EnterpriseLibrary.Common.Configuration;  
  8. usingMicrosoft.Practices.EnterpriseLibrary.ExceptionHandling;  
  9. namespaceArtech.Mvc.ExceptionHandling  
  10. {  
  11. publicclassExceptionActionInvoker: ControllerActionInvoker  
  12. {  
  13. protectedExceptionHandlingSettings ExceptionHandlingSettings{get; privateset;}  
  14. protectedvirtualFunc<string, HandleErrorInfo, ViewResult> GetErrorView { get; privateset; }  
  15. publicExceptionPolicyImpl ExceptionPolicy { get; privateset; }  
  16. publicExceptionActionInvoker(stringexceptionPolicy,Func<string, HandleErrorInfo, ViewResult> getErrorView)  
  17. {  
  18. this.ExceptionPolicy = EnterpriseLibraryContainer.Current.GetInstance<ExceptionPolicyImpl>(exceptionPolicy);  
  19. this.GetErrorView = getErrorView;  
  20. this.ExceptionHandlingSettings = ExceptionHandlingSettings.GetSection();  
  21. }  
  22. publicoverrideboolInvokeAction(ControllerContext controllerContext, stringhandleErrorActionName)  
  23. {  
  24. ExceptionContext exceptionContext = controllerContext asExceptionContext;  
  25. if(null== exceptionContext)  
  26. {  
  27. thrownewArgumentException("The controllerContext must be ExceptionContext!""controllerContext");  
  28. }  
  29. try 
  30. {  
  31. exceptionContext.ExceptionHandled = true;  
  32. if(this.ExceptionPolicy.HandleException(exceptionContext.Exception))  
  33. {  
  34. HandleRethrownException(exceptionContext);  
  35. }  
  36. else 
  37. {  
  38. if(ExceptionHandlingContext.Current.Errors.Count == 0)  
  39. {  
  40. ExceptionHandlingContext.Current.Errors.Add(exceptionContext.Exception.Message);  
  41. }  
  42. ControllerDescriptor controllerDescriptor = this.GetControllerDescriptor(exceptionContext);  
  43. ActionDescriptor handleErrorAction = FindAction(exceptionContext, controllerDescriptor, handleErrorActionName);  
  44. if(null!= handleErrorAction)  
  45. {  
  46. IDictionary<stringobject>parameters = GetParameterValues(controllerContext, handleErrorAction);  
  47. exceptionContext.Result = this.InvokeActionMethod(exceptionContext, handleErrorAction, parameters);  
  48. }  
  49. else 
  50. {  
  51. HandleRethrownException(exceptionContext);  
  52. }  
  53. }  
  54. returntrue;  
  55. }  
  56. catch(Exception ex)  
  57. {  
  58. exceptionContext.Exception = ex;60:HandleRethrownException(exceptionContext);  
  59. returntrue;  
  60. }  
  61. }  
  62. protectedvirtualvoidHandleRethrownException(ExceptionContext exceptionContext)  
  63. {  
  64. stringerrorViewName = this.GetErrorViewName(exceptionContext.Exception.GetType());  
  65. stringcontrollerName = (string)exceptionContext.RouteData.GetRequiredString("controller");  
  66. stringaction = (string)exceptionContext.RouteData.GetRequiredString("action");  
  67. HandleErrorInfo handleErrorInfo = newHandleErrorInfo(exceptionContext.Exception, controllerName, action);70:exceptionContext.Result = this.GetErrorView(errorViewName, handleErrorInfo);  
  68. }  
  69. protectedstringGetErrorViewName(Type exceptionType)  
  70. {  
  71. ExceptionErrorViewElement element = ExceptionHandlingSettings.ExceptionErrorViews75:.Cast<ExceptionErrorViewElement>().FirstOrDefault(el=>el.ExceptionType == exceptionType);  
  72. if(null!= element)  
  73. {  
  74. returnelement.ErrorView;  
  75. }  
  76. if(null== element &&null!= exceptionType.BaseType!= null)  
  77. {  
  78. returnGetErrorViewName(exceptionType.BaseType);  
  79. }  
  80. else 
  81. {  
  82. return"Error";  
  83. }  
  84. }  
  85. }  

  五、自定義Controller:BaseController

  ExceptionActionInvoker最終在我們自定義的Controller基類BaseController中被調(diào)用的。ExceptionActionInvoker對象在構(gòu)造函數(shù)中被初始化,并在重寫的OnException方法中被調(diào)用。

 

  1. usingSystem;  
  2. usingSystem.Web.Mvc;  
  3. namespaceArtech.Mvc.ExceptionHandling  
  4. {  
  5. publicabstractclassBaseController : Controller  
  6. {  
  7. publicBaseController(stringexceptionPolicy)  
  8. {  
  9. Func<string, HandleErrorInfo, ViewResult> getErrorView = (viewName, handleErrorInfo) => this.View(viewName, handleErrorInfo);  
  10. this.ExceptionActionInvoker = newExceptionActionInvoker(exceptionPolicy,getErrorView);  
  11. }  
  12. publicBaseController(ExceptionActionInvoker actionInvoker)  
  13. {  
  14. this.ExceptionActionInvoker = actionInvoker;
  15. }
  16. publicvirtualExceptionActionInvoker ExceptionActionInvoker { get; privateset; }  
  17. protectedvirtualstringGetHandleErrorActionName(stringactionName)  
  18. {  
  19. returnstring.Format("On{0}Error", actionName);  
  20. }  
  21. protectedoverridevoidOnException(ExceptionContext filterContext)  
  22. {  
  23. using(ExceptionHandlingContextScope contextScope = newExceptionHandlingContextScope(filterContext))  
  24. {  
  25. stringactionName = RouteData.GetRequiredString("action");  
  26. stringhandleErrorActionName = this.GetHandleErrorActionName(actionName);  
  27. this.ExceptionActionInvoker.InvokeAction(filterContext, handleErrorActionName);  
  28. foreach(var error inExceptionHandlingContext.Current.Errors)  
  29. {  
  30. ModelState.AddModelError(Guid.NewGuid().ToString() ,error.ErrorMessage);  
  31. }  
  32. }  
  33. }  
  34. }  

  值得一提的是:整個(gè)OnException方法中的操作都在一個(gè)ExceptionHandlingContextScope中進(jìn)行的。顧名思義, 我們通過ExceptionHandlingContextScope為ExceptionHandlingContext創(chuàng)建了一個(gè)范圍。ExceptionHandlingContext定義如下,我們可以通過它獲得當(dāng)前的ExceptionContext和ModelErrorCollection,而靜態(tài)屬性Current返回當(dāng)前的ExceptionHandlingContext對象。

 

  1. publicclassExceptionHandlingContext  
  2. {  
  3. [ThreadStatic]  
  4. privatestaticExceptionHandlingContext current;  
  5. publicExceptionContext ExceptionContext { get; privateset; }  
  6. publicModelErrorCollection Errors { get; privateset; }  
  7. publicExceptionHandlingContext(ExceptionContext exceptionContext)  
  8. {  
  9. this.ExceptionContext = exceptionContext;
  10. this.Errors = newModelErrorCollection();  
  11. }  
  12. publicstaticExceptionHandlingContext Current  
  13. {  
  14. get { returncurrent; }  
  15. set { current = value;}  
  16. }  

  在BaseController的OnException方法中,當(dāng)執(zhí)行了ExceptionActionInvoker的InvokeAction之后,我們會(huì)將當(dāng)前ExceptionHandlingContext的ModelError轉(zhuǎn)移到當(dāng)前的ModelState中。這就是為什么我們會(huì)通過ValidationSummary顯示錯(cuò)誤信息的原因。對于我們的例子來說,錯(cuò)誤消息的指定是通過如下所示的ErrorMessageSettingHandler 實(shí)現(xiàn)的,而它僅僅將指定的錯(cuò)誤消息添加到當(dāng)前ExceptionHandlingContext的Errors屬性集合中而已。

 

  1. [ConfigurationElementType(typeof(ErrorMessageSettingHandlerData))]  
  2. publicclassErrorMessageSettingHandler : IExceptionHandler  
  3. {  
  4. publicstringErrorMessage { get; privateset; }  
  5. publicErrorMessageSettingHandler(stringerrorMessage)  
  6. {  
  7. this.ErrorMessage = errorMessage;  
  8. }  
  9. publicException HandleException(Exception exception, Guid handlingInstanceId)  
  10. {  
  11. if(null== ExceptionHandlingContext.Current)  
  12. {  
  13. thrownewInvalidOperationException("...");  
  14. }  
  15. if(string.IsNullOrEmpty(this.ErrorMessage))  
  16. {  
  17. ExceptionHandlingContext.Current.Errors.Add(exception.Message);  
  18. }  
  19. else 
  20. {  
  21. ExceptionHandlingContext.Current.Errors.Add(this.ErrorMessage);  
  22. }  
  23. returnexception;  
  24. }  

原文鏈接:http://www.cnblogs.com/artech/archive/2012/01/10/exception-handling-in-asp-mvc.html

【編輯推薦】

  1. ASP.NET MVC會(huì)成為ASP.NET未來主流的UI平臺?
  2. ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存
  3. 想愛容易相處難:當(dāng)ASP.NET MVC愛上IoC
  4. 導(dǎo)致ASP.NET站點(diǎn)重啟的十大原因
  5. 淺談ASP.NET核心對象
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-07-22 11:00:30

ASP.NET MVC

2009-07-24 11:24:33

ASP.NET中文亂碼

2009-02-06 14:11:36

ASP.NET.NET全局異常處理

2009-07-22 17:37:06

ASP.NET Ses

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2010-06-04 19:06:47

連接MySQL數(shù)據(jù)庫

2009-07-30 16:02:53

2010-09-02 15:18:42

CSSASP.NET

2009-07-23 16:53:17

ASP.NET中文變問

2009-07-20 15:44:32

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2011-09-22 10:58:56

ASP.NET

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

www.免费av| 久久久国内精品| 一本一道无码中文字幕精品热| 国产亚洲一卡2卡3卡4卡新区| 欧美色老头old∨ideo| 裸体大乳女做爰69| 天天干天天干天天干| 丝袜亚洲另类欧美综合| 日韩在线播放视频| 男男做爰猛烈叫床爽爽小说| 影音成人av| 亚洲国产欧美一区二区三区丁香婷| 久久久久久久久久码影片| 91片黄在线观看喷潮| 韩国精品一区二区三区| 日韩成人av在线| 艹b视频在线观看| 国产精品vvv| 亚洲日本在线看| 国产精品二区二区三区| 中文字幕日本人妻久久久免费 | 8x8ⅹ拨牐拨牐拨牐在线观看| 国产午夜精品久久久久久免费视| av噜噜色噜噜久久| 国产精品成人久久久| 在线成人亚洲| 九九热视频这里只有精品| 久久午夜福利电影| 超碰精品在线| 日韩一区二区三区av| 激情五月婷婷久久| 僵尸再翻生在线观看| 亚洲乱码精品一二三四区日韩在线| 欧美区高清在线| 天堂在线资源8| 国产福利电影一区二区三区| 日本欧美在线视频| 九九热在线视频播放| 日韩成人伦理| 色猫猫成人app| 国产精品久久一卡二卡| 欧美国产综合视频| 亚洲日本国产精品| 成人手机电影网| 不卡视频一区| 亚洲av永久无码国产精品久久| 精品一区二区三区免费| 国产精品男女猛烈高潮激情| 亚洲GV成人无码久久精品| 在线欧美日韩| 亚洲91精品在线观看| 久久在线视频精品| 国产专区一区| 久久久久久这里只有精品| 激情五月少妇a| 国产精品多人| 欧美精品九九久久| 伊人365影院| 在线成人亚洲| 欧美一区二区三区……| 6080午夜伦理| 日本欧美一区二区三区乱码| 国产精品久久中文| 亚洲一级视频在线观看| 久久 天天综合| 成人中文字幕在线观看| 国产黄色一区二区| 国产91丝袜在线18| 精品日韩美女| 精品无吗乱吗av国产爱色| 国产欧美在线观看一区| 致1999电视剧免费观看策驰影院| 黄网站免费在线观看| 一区二区三区日本| 精品无码一区二区三区在线| 中文字幕乱码在线播放| 在线视频国内自拍亚洲视频| 亚洲精品www.| 999久久久久久久久6666| 337p日本欧洲亚洲大胆色噜噜| 久久久久国产精品无码免费看| 免费不卡中文字幕在线| 最新国产精品亚洲| 久久久久无码国产精品| 国产精品美女| 国产伊人精品在线| 免费a级片在线观看| 久久精子c满五个校花| 亚洲欧洲在线一区| 成年人国产在线观看| 在线免费观看一区| 免费看的av网站| 亚洲专区视频| 久久成人精品电影| 最新中文字幕一区| 国产又粗又猛又爽又黄91精品| 国产精品一国产精品最新章节| 国产1区2区3区在线| 亚洲综合在线视频| 欧美精品第三页| 电影91久久久| 亚洲美女视频网站| 欧美色图亚洲视频| 久久九九99| 国产高清一区视频| 95在线视频| 精品毛片网大全| 一级网站在线观看| 禁果av一区二区三区| 欧美大秀在线观看| 在线播放亚洲精品| 2021中文字幕一区亚洲| 欧美乱做爰xxxⅹ久久久| 亚洲不卡系列| 日韩av在线一区二区| 特级片在线观看| 蜜臀久久99精品久久久画质超高清 | 国产在线xxx| 欧美日韩aaa| 色婷婷av777| 欧美日韩一区自拍| 国产日韩在线免费| 欧洲免费在线视频| 亚洲成人自拍网| 三级黄色片免费观看| 精品久久综合| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国产www| 综合av第一页| 国产精品拍拍拍| 九热爱视频精品视频| 久久久亚洲成人| www.xxx国产| 国产精品九色蝌蚪自拍| 欧美黑人又粗又大又爽免费| 女人抽搐喷水高潮国产精品| 欧美国产高跟鞋裸体秀xxxhd| 国产精品一区二区免费视频| xxxx黄色片| 亚洲激情社区| 国产伦精品一区二区三区照片| 五月天激情在线| 日韩一本二本av| 欧美日韩精品亚洲精品| 国产九九视频一区二区三区| 国产又爽又黄ai换脸| 婷婷激情成人| yellow中文字幕久久| 亚洲自拍偷拍另类| 亚洲婷婷综合色高清在线| 天天干天天操天天做| 欧美第一精品| 91视频88av| 97caopron在线视频| 欧美一级欧美三级| 中国毛片直接看| 国产成人啪免费观看软件| 黄色一级大片免费| 国产极品模特精品一二| 久久免费国产视频| 四虎精品在线| 色88888久久久久久影院按摩| 大又大又粗又硬又爽少妇毛片| 久久一区亚洲| 亚洲黄色成人久久久| 色噜噜成人av在线| 久久国产精品电影| 狠狠躁日日躁夜夜躁av | 91在线视频免费播放| 久久久久久一二三区| 密臀av一区二区三区| 91久久夜色精品国产按摩| 91免费视频国产| 成人福利电影| 在线日韩av观看| 国产男女裸体做爰爽爽| 亚洲大型综合色站| 特级西西www444人体聚色 | 狠狠综合久久| 精品国产乱码久久久久久丨区2区| 午夜伦理福利在线| 中文字幕综合一区| 懂色av蜜臀av粉嫩av分享吧| 欧美色videos| 可以免费看av的网址| 成人免费看的视频| 波多结衣在线观看| 午夜欧美精品| 欧美一区观看| 免费欧美网站| 国产999精品久久久影片官网| 求av网址在线观看| 日韩av综合网站| 91精品中文字幕| 亚洲高清视频中文字幕| 中文字幕伦理片| 成人午夜电影久久影院| www.精品在线| 国产农村妇女精品一区二区| 一级做a爰片久久| 欧美日韩看看2015永久免费 | www.亚洲天堂.com| 在线日韩av片| 日韩黄色精品视频| 国产精品免费观看视频| 喷水视频在线观看| 激情综合网天天干| 国产精品久久久久9999小说| 欧美日韩 国产精品| 午夜精品美女久久久久av福利| 一区二区三区四区高清视频| 国产精品国产三级国产aⅴ9色| 国产探花在线观看| 久久国产精品久久久久久| 国产天堂在线| 亚洲精品国精品久久99热一| 国产99久久九九精品无码免费| 色94色欧美sute亚洲13| 国产三级av片| 亚洲一区免费视频| 美国黄色小视频| 国产精品久久久久久久午夜片 | 91sao在线观看国产| 中文字幕有码在线观看| 中文字幕日韩精品在线观看| 三级国产在线观看| 亚洲国产精品高清久久久| av在线免费在线观看| 欧美精品 国产精品| 波多野结衣视频网址| 五月婷婷激情综合| 国产亚洲欧美久久久久| 亚洲狼人国产精品| 亚洲女人久久久| 国产精品无码永久免费888| 中文字幕在线免费看线人| 成人在线视频一区| 9191在线视频| 国产高清精品在线| 丰满人妻一区二区三区大胸| 国产一区激情在线| 特级西西444www| 国产最新精品免费| 杨幂一区二区国产精品| 国产精品一区二区久久不卡| 中文字幕第三区| 国产伦精品一区二区三区免费 | 免费一级特黄毛片| 韩日在线一区| 国产免费一区二区视频| 在线欧美不卡| 激情六月丁香婷婷| 亚洲欧美日韩国产一区| 白嫩少妇丰满一区二区| 日本欧美一区二区在线观看| 超碰超碰在线观看| 国内精品第一页| www.555国产精品免费| zzijzzij亚洲日本少妇熟睡| 国产人妻人伦精品1国产丝袜| 91视频免费播放| 欧美亚洲色综久久精品国产| 最近中文字幕一区二区三区| 一级黄色录像视频| 午夜日韩在线电影| 亚洲黄网在线观看| 制服.丝袜.亚洲.中文.综合| 国产av无码专区亚洲av| 精品国产乱码久久久久久图片| 日本黄色免费视频| 亚洲天堂2020| 国产鲁鲁视频在线观看特色| 欧美人与物videos| 天堂√8在线中文| 国产精品久久久久9999| 日本在线成人| 欧美二区在线| 中文不卡在线| 自拍日韩亚洲一区在线| 人人精品人人爱| 992tv人人草| 久久伊99综合婷婷久久伊| 懂色av粉嫩av浪潮av| 亚洲一区二区3| 波多野结衣网站| 日韩欧美亚洲国产精品字幕久久久| 三级视频在线看| 最近中文字幕mv在线一区二区三区四区| yellow91字幕网在线| 国产91精品黑色丝袜高跟鞋| 日韩国产大片| 精品国产乱码久久久久久88av| 日韩精品2区| 亚洲熟妇无码一区二区三区| 喷水一区二区三区| 国产高潮视频在线观看| 国产精品天干天干在观线| 精品无码免费视频| 欧美日韩在线免费视频| 无码精品人妻一区二区| 精品国产一区二区三区在线观看| 蜜桃麻豆av在线| 91在线视频导航| 激情五月色综合国产精品| 免费网站永久免费观看| 精品一二三四区| 亚洲欧洲久久久| 午夜精品久久久久影视| 国产模特av私拍大尺度| 国产一区二区日韩| 妞干网免费在线视频| 亚洲伊人久久综合| 欧美顶级大胆免费视频| chinese少妇国语对白| proumb性欧美在线观看| 免费一级片视频| 欧美高清精品3d| 免费观看成年在线视频网站| 久久久久五月天| 精品欧美视频| 中文字幕日韩精品一区二区| 久热精品在线| 国产偷人妻精品一区| 亚洲国产综合人成综合网站| 国产精品视频第一页| 中文字幕在线国产精品| 日韩欧美一区二区三区在线观看 | 精品一区二区三区在线| 欧美久久久久久久久久久久久| 国产美女娇喘av呻吟久久| 亚洲aaa视频| 欧美少妇一区二区| melody高清在线观看| 国产成人精品久久二区二区91| 全国精品免费看| 欧美精品99久久| 99精品久久久久久| 日本三级黄色大片| 亚洲国产精品网站| 欧美sm一区| 欧美另类高清视频在线| 视频一区二区三区在线| 四虎国产精品成人免费入口| 91官网在线免费观看| 国产高清一级毛片在线不卡| 国产成人精品亚洲精品| 国产成人黄色| 欧美一级裸体视频| 国产精品人成在线观看免费 | 日韩精品一区二区三区三区免费| 精品美女在线观看视频在线观看| 成人黄色av网站| 夜间精品视频| 欧美极品jizzhd欧美仙踪林| 亚洲成人在线免费| 天天摸天天干天天操| 国产91精品不卡视频| 国产欧美一区二区三区精品观看| 国产精品人人爽人人爽| 国产精品看片你懂得| 国产人妖一区二区| 久久久久久久久久久91| 欧美精品中文| 91香蕉视频污版| 亚洲天堂免费在线观看视频| 懂色av蜜臀av粉嫩av分享吧| 欧美性一区二区三区| 日韩精品中文字幕第1页| 三年中文在线观看免费大全中国| 亚洲黄色小说网站| 亚洲欧美一区二区三| 国产精品日韩久久久久| 91精品国产乱码久久久久久久| 亚洲精品久久一区二区三区777| 欧美日韩国产黄| 成人网视频在线观看| 亚洲精品欧美极品| 亚洲人体偷拍| 免费看日本黄色片| 日韩女优毛片在线| 大胆人体一区| 8x8x华人在线| 久久综合九色综合欧美98| 一区二区三区精彩视频| 欧美精品久久久久久久久| 激情五月综合| 东京热av一区| 欧美日韩在线播放一区| av老司机在线观看| 夜夜爽www精品| 99久久精品免费| 一区二区不卡视频在线观看| 亚洲97在线观看| 久久精品国内一区二区三区水蜜桃| 国产精品久久久久久亚洲色| 欧美日韩久久不卡| 涩涩网在线视频| 国产日韩欧美大片| 国产日产欧美一区二区视频| 亚洲国产一二三区|