前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC下基于异常处理的完整解决方案

ASP.NET MVC下基于异常处理的完整解决方案

作者头像
蒋金楠
发布于 2018-02-07 10:59:49
发布于 2018-02-07 10:59:49
1.2K0
举报
文章被收录于专栏:大内老A大内老A

EntLib的异常处理应用块(Exception Handling Application Block)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略。而ASP.NET MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的解决异常处理解决方案。[源代码从这里下载]

目录 一、基本异常处理策略 二、通过自定义Action处理异常 三、通过配置的Error View处理异常 四、自定义ActionInvoker:ExceptionActionInvoker 五、自定义Controller:BaseController

一、基本异常处理策略

我们首先来讨论我们的解决方案具体采用的异常处理策略:

  • 对于执行Controller的某个Action方法抛出的异常,我们会按照指定配置策略进行处理。我们可以采取日志记录、异常替换和封装这些常用的异常处理方式;
  • 对于处理后的异常,如果异常处理策略规定需要将其抛出,则会自动重定向到与异常类型匹配的出错页面。我们会维护一个异常类型和Error View的匹配关系;
  • 对于处理后的异常,如果异常处理策略规定不需要将其抛出,则会执行与当前Action操作相匹配的错误处理Action进行处理。异常处理Action方法默认采用“On{Action}Error”这样的命名规则,而当前上下文会与异常处理操作方法的参数进行绑定。除次之外,我们会设置当前ModelState的错误信息;
  • 如果用户不曾定义相应的异常处理Action,依然采用“错误页面重定向”方式进行异常处理。

二、通过自定义Action处理异常

为了让读者对上面介绍的异常处理页面有一个深刻的理解,我们来进行一个实例演示。该实例用于模拟用户登录,我们定义了如下一个只包含用户名和密码两个属性的Model:LoginInfoModel。

代码语言:js
AI代码解释
复制
   1: namespace Artech.Mvc.ExceptionHandling.Models
   2: {
   3:     public class LoginInfo
   4:     {
   5:         [Display(Name ="User Name")]
   6:         [Required(ErrorMessage = "User Name is manadatory!")]
   7:         public string UserName { get; set; }
   8:  
   9:         [Display(Name = "Password")]
  10:         [DataType(DataType.Password)]
  11:         [Required(ErrorMessage = "Password is manadatory!")]
  12:         public string Password { get; set; }
  13:     }
  14: }

我们定义了如下一个AccountController,它是我们自定义的BaseController的子类。AccountController在构造的时候调用基类构造函数指定的参数代表异常处理策略的配置名称。SignIn方法代表用于进行“登录”的操作,而OnSignInError就表示该操作对应的异常处理操作。如果在SignIn操作中抛出的异常经过处理后无需再抛出,则会通过调用OnSignInError,而此时ModelState已经被设置了相应的错误消息。

代码语言:js
AI代码解释
复制
   1: public class AccountController : BaseController
   2: {
   3:     public AccountController()
   4:         : base("myPolicy")
   5:     { }
   6:  
   7:     public ActionResult SignIn()
   8:     {
   9:         return View(new LoginInfo());
  10:     }
  11:     [HttpPost]
  12:     public ActionResult SignIn(LoginInfo loginInfo)
  13:     {
  14:         if (!ModelState.IsValid)
  15:         {
  16:             return this.View(new LoginInfo { UserName = loginInfo.UserName });
  17:         }
  18:  
  19:         if (loginInfo.UserName != "Foo")
  20:         {
  21:             throw new InvalidUserNameException();
  22:         }
  23:  
  24:         if (loginInfo.Password != "password")
  25:         {
  26:             throw new UserNamePasswordNotMatchException();
  27:         }
  28:  
  29:         ViewBag.Message = "Authentication Succeeds!";
  30:         return this.View(new LoginInfo { UserName = loginInfo.UserName });
  31:     }
  32:  
  33:     public ActionResult OnSignInError(string userName)
  34:     {
  35:         return this.View(new LoginInfo { UserName = userName });
  36:     }
  37: }

具体定义在SignIn操作方法中的认证逻辑是这样的:如果用户名不是“Foo”则抛出InvalidUserNameException异常;如果密码不是“password”则抛出UserNamePasswordNotMatchException异常。下面是SignIn操作对应的View的定义:

代码语言:js
AI代码解释
复制
   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()
  13:     <input type="submit" value="SignIn" />
  14: }

在AccountController初始化时指定的异常处理策略“myPolicy”定义在如下的配置中。我们专门针对SignIn操作方法抛出的InvalidUserNameException和UserNamePasswordNotMatchException进行了处理,而ErrorMessageSettingHandler是我们自定义的异常处理器,它仅仅用于设置错误消息。如下面的代码片断所示,如果上述的这两种类型的异常被抛出,最终的错误消息会被指定为“User name does not exist!”和“User name does not match password!”。

代码语言:js
AI代码解释
复制
   1: <exceptionHandling>
   2:   <exceptionPolicies>
   3:     <add name="myPolicy">
   4:       <exceptionTypes>
   5:         <add name="InvalidUserNameException" 
   6:                type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"
   7:              postHandlingAction="None">
   8:           <exceptionHandlers>
   9:             <add name="ErrorMessageSettingHandler"
  10:                  type="Artech.Mvc.ExceptionHandling.ErrorMessageSettingHandler, Artech.Mvc.ExceptionHandling"
  11:                  errorMessage="User name does not exist!"/>
  12:           </exceptionHandlers>
  13:         </add>
  14:         <add name="UserNamePasswordNotMatchException" 
  15:                type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"
  16:              postHandlingAction="None">
  17:           <exceptionHandlers>
  18:             <add name="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>

现在我们通过路由映射将AccountController和Sign设置为默认Controller和Action后,开启我们的应用程序。在输入错误的用户名和错误明码的情况下在ValidationSummary中将自动得到相应的错误消息。

三、通过配置的Error View处理异常

在上面的配置中,针对InvalidUserNameException和UserNamePasswordNotMatchException这两种异常类型的配置策略都将PostHandlingAction属性设置为“None”,意味着不会将原来的异常和处理后的异常进行重新抛出。现在我们将该属性设置为“ThrowNewException”,意味着我们会将处理后的异常重新抛出来。

代码语言:js
AI代码解释
复制
   1: <exceptionHandling>
   2:   <exceptionPolicies>
   3:     <add name="myPolicy">
   4:       <exceptionTypes>
   5:         <add name="InvalidUserNameException" type="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"
   6:              postHandlingAction="ThrowNewException">
   7:          ...
   8:         <add name="UserNamePasswordNotMatchException" type="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"
   9:              postHandlingAction="ThrowNewException">
  10:           ...
  11:         </add>          
  12:       </exceptionTypes>
  13:     </add>
  14:   </exceptionPolicies>
  15: </exceptionHandling>

按照我们上面的异常处理策略,在这种情况下我们将采用“错误页面”的方式来进行异常处理。也HandleErrorAttribute的处理方式类似,我们支持异常类型和Error View之间的匹配关系,而这是通过类似于如下的配置来定义的。值得一提的是,这里的异常类型是经过处理后重新抛出的异常。

代码语言:js
AI代码解释
复制
   1: <artech.exceptionHandling>
   2:   <add exceptionType="Artech.Mvc.ExceptionHandling.Models.InvalidUserNameException, Artech.Mvc.ExceptionHandling"
   3:         errorView="InvalideUserNameError"/>
   4:   <add exceptionType="Artech.Mvc.ExceptionHandling.Models.UserNamePasswordNotMatchException, Artech.Mvc.ExceptionHandling"
   5:         errorView="UserNamePasswordNotMatchError"/>
   6: </artech.exceptionHandling>

如上面的配置所示,我们为InvalidUserNameException和UserNamePasswordNotMatchException这两种异常类型定义了不同的Error View,分别是“InvalideUserNameError”和“UserNamePasswordNotMatchError”,详细定义如下所示:

代码语言:js
AI代码解释
复制
   1: @{
   2:     Layout = null;
   3: }
   4: <!DOCTYPE html>
   5: <html>
   6: <head>
   7:     <title>Error</title>
   8: </head>
   9: <body>
  10:     <p style="color:Red; font-weight:bold">Sorry,the user name you specify does not exist!</p>
  11: </body>
  12: </html>
  13:  
  14: @{
  15:     Layout = null;
  16: }
  17: <!DOCTYPE html>
  18: <html>
  19: <head>
  20:     <title>Error</title>
  21: </head>
  22: <body>
  23:     <p style="color:Red; font-weight:bold">Sorry, The password does not match the given user name!</p>
  24: </body>
  25: </html>

现在我们按照上面的方式运行我们的程序,在分别输入错误的用户名和密码的情况下会自动显现相应的错误页面。

四、自定义ActionInvoker:ExceptionActionInvoker

对于上述的两种不同的异常处理方式最终是通过自定义的ActionInvoker来实现的,我们将其命名为ExceptionActionInvoker。如下面的代码片断所式,ExceptionActionInvoker直接继承自ControllerActionInvoker。属性ExceptionPolicy是一个基于指定的异常策略名称创建的ExceptionPolicyImpl 对象,用于针对EntLib进行的异常处理。而属性GetErrorView是一个用于获得作为错误页面的ViewResult对象的委托。整个异常处理的核心定义在InvokeAction方法中,该方法中指定的handleErrorActionName参数代表的是“异常处理操作名称”,整个方法就是按照上述的异常处理策略实现的。

代码语言:js
AI代码解释
复制
   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.Mvc;
   6: using Artech.Mvc.ExceptionHandling.Configuration;
   7: using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
   8: using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
   9: namespace Artech.Mvc.ExceptionHandling
  10: {
  11:     public class ExceptionActionInvoker: ControllerActionInvoker
  12:     {
  13:         protected ExceptionHandlingSettings ExceptionHandlingSettings{get; private set;}
  14:         protected virtual Func<string, HandleErrorInfo, ViewResult> GetErrorView { get; private set; }
  15:         public ExceptionPolicyImpl ExceptionPolicy { get; private set; }
  16:         public ExceptionActionInvoker(string exceptionPolicy,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:  
  23:         public override bool InvokeAction(ControllerContext controllerContext, string handleErrorActionName)
  24:         {
  25:             ExceptionContext exceptionContext = controllerContext as ExceptionContext;
  26:             if (null == exceptionContext)
  27:             {
  28:                 throw new ArgumentException("The controllerContext must be ExceptionContext!", "controllerContext");
  29:             }
  30:             try
  31:             {
  32:                 exceptionContext.ExceptionHandled = true;
  33:                 if (this.ExceptionPolicy.HandleException(exceptionContext.Exception))
  34:                 {
  35:                     HandleRethrownException(exceptionContext);
  36:                 }
  37:                 else
  38:                 {
  39:                     if (ExceptionHandlingContext.Current.Errors.Count == 0)
  40:                     {
  41:                         ExceptionHandlingContext.Current.Errors.Add(exceptionContext.Exception.Message);
  42:                     }
  43:                     ControllerDescriptor controllerDescriptor = this.GetControllerDescriptor(exceptionContext);
  44:                     ActionDescriptor handleErrorAction = FindAction(exceptionContext, controllerDescriptor, handleErrorActionName);
  45:                     if (null != handleErrorAction)
  46:                     {
  47:                         IDictionary<string, object> parameters = GetParameterValues(controllerContext, handleErrorAction);
  48:                         exceptionContext.Result = this.InvokeActionMethod(exceptionContext, handleErrorAction, parameters);
  49:                     }
  50:                     else
  51:                     {
  52:                         HandleRethrownException(exceptionContext);
  53:                     }
  54:                 }
  55:                 return true;
  56:             }
  57:             catch (Exception ex)
  58:             {
  59:                 exceptionContext.Exception = ex;
  60:                 HandleRethrownException(exceptionContext);
  61:                 return true;
  62:             }
  63:         }
  64:         protected virtual void HandleRethrownException(ExceptionContext exceptionContext)
  65:         {
  66:             string errorViewName = this.GetErrorViewName(exceptionContext.Exception.GetType());
  67:             string controllerName = (string)exceptionContext.RouteData.GetRequiredString("controller");
  68:             string action = (string)exceptionContext.RouteData.GetRequiredString("action");
  69:             HandleErrorInfo handleErrorInfo = new HandleErrorInfo(exceptionContext.Exception, controllerName, action);
  70:             exceptionContext.Result = this.GetErrorView(errorViewName, handleErrorInfo);
  71:         }
  72:         protected string GetErrorViewName(Type exceptionType)
  73:         {
  74:             ExceptionErrorViewElement element = ExceptionHandlingSettings.ExceptionErrorViews
  75:                 .Cast<ExceptionErrorViewElement>().FirstOrDefault(el=>el.ExceptionType == exceptionType);
  76:             if(null != element)
  77:             {
  78:                 return element.ErrorView;
  79:             }
  80:             if(null== element && null != exceptionType.BaseType!= null)
  81:             {
  82:                 return GetErrorViewName(exceptionType.BaseType);
  83:             }
  84:             else
  85:             {
  86:                 return "Error";
  87:             }
  88:         }
  89:     }
  90: }

五、自定义Controller:BaseController

ExceptionActionInvoker最终在我们自定义的Controller基类BaseController中被调用的。ExceptionActionInvoker对象在构造函数中被初始化,并在重写的OnException方法中被调用。

代码语言:js
AI代码解释
复制
   1: using System;
   2: using System.Web.Mvc;
   3: namespace Artech.Mvc.ExceptionHandling
   4: {
   5:     public abstract class BaseController : Controller
   6:     {
   7:         public BaseController(string exceptionPolicy)
   8:         {
   9:             Func<string, HandleErrorInfo, ViewResult> getErrorView = (viewName, handleErrorInfo) => this.View(viewName, handleErrorInfo);
  10:             this.ExceptionActionInvoker = new ExceptionActionInvoker(exceptionPolicy,getErrorView);
  11:         }
  12:         public BaseController(ExceptionActionInvoker actionInvoker)
  13:         {
  14:             this.ExceptionActionInvoker = actionInvoker;
  15:         }
  16:  
  17:         public virtual ExceptionActionInvoker ExceptionActionInvoker { get; private set; }
  18:  
  19:         protected virtual string GetHandleErrorActionName(string actionName)
  20:         {
  21:             return string.Format("On{0}Error", actionName);
  22:         }
  23:  
  24:         protected override void OnException(ExceptionContext filterContext)
  25:         {
  26:             using (ExceptionHandlingContextScope contextScope = new ExceptionHandlingContextScope(filterContext))
  27:             {
  28:                 string actionName = RouteData.GetRequiredString("action");
  29:                 string handleErrorActionName = this.GetHandleErrorActionName(actionName);
  30:                 this.ExceptionActionInvoker.InvokeAction(filterContext, handleErrorActionName);
  31:                 foreach (var error in ExceptionHandlingContext.Current.Errors)
  32:                 {
  33:                     ModelState.AddModelError(Guid.NewGuid().ToString() ,error.ErrorMessage);
  34:                 }
  35:             }
  36:         }
  37:     }
  38: }

值得一提的是:整个OnException方法中的操作都在一个ExceptionHandlingContextScope中进行的。顾名思义, 我们通过ExceptionHandlingContextScope为ExceptionHandlingContext创建了一个范围。ExceptionHandlingContext定义如下,我们可以通过它获得当前的ExceptionContext和ModelErrorCollection,而静态属性Current返回当前的ExceptionHandlingContext对象。

代码语言:js
AI代码解释
复制
   1: public class ExceptionHandlingContext
   2: {
   3:     [ThreadStatic]
   4:     private static ExceptionHandlingContext current;
   5:  
   6:     public ExceptionContext ExceptionContext { get; private set; }
   7:     public ModelErrorCollection Errors { get; private set; }
   8:  
   9:     public ExceptionHandlingContext(ExceptionContext exceptionContext)
  10:     {
  11:         this.ExceptionContext = exceptionContext;
  12:         this.Errors = new ModelErrorCollection();
  13:     }
  14:     public static ExceptionHandlingContext Current
  15:     {
  16:         get { return current; }
  17:         set { current = value; }
  18:     }
  19: }

在BaseController的OnException方法中,当执行了ExceptionActionInvoker的InvokeAction之后,我们会将当前ExceptionHandlingContext的ModelError转移到当前的ModelState中。这就是为什么我们会通过ValidationSummary显示错误信息的原因。对于我们的例子来说,错误消息的指定是通过如下所示的ErrorMessageSettingHandler 实现的,而它仅仅将指定的错误消息添加到当前ExceptionHandlingContext的Errors属性集合中而已。

代码语言:js
AI代码解释
复制
   1: [ConfigurationElementType(typeof(ErrorMessageSettingHandlerData))]
   2: public class ErrorMessageSettingHandler : IExceptionHandler
   3: {
   4:     public string ErrorMessage { get; private set; }
   5:     public ErrorMessageSettingHandler(string errorMessage)
   6:     {
   7:         this.ErrorMessage = errorMessage;
   8:     }
   9:     public Exception HandleException(Exception exception, Guid handlingInstanceId)
  10:     {
  11:         if (null == ExceptionHandlingContext.Current)
  12:         {
  13:             throw new InvalidOperationException("...");
  14:         }
  15:  
  16:         if (string.IsNullOrEmpty(this.ErrorMessage))
  17:         {
  18:             ExceptionHandlingContext.Current.Errors.Add(exception.Message);
  19:         }
  20:         else
  21:         {
  22:             ExceptionHandlingContext.Current.Errors.Add(this.ErrorMessage);
  23:         }
  24:         return exception;
  25:     }
  26: }  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
http 3.0 QUIC 方案你知道多少?
QUIC(Quick UDP Internet Connections)是一种基于用户数据报协议(UDP)的高效、可靠的传输协议,由Google开发并在IETF标准化为RFC 9000。QUIC的目标是解决TCP和TLS在现代互联网应用场景中的一些局限性,特别是降低延迟、改善拥塞控制以及应对连接迁移等问题。
Jacky-易小天
2024/04/16
1930
[计算机网络]课程论文:万字长文详解QUIC协议,为什么有了TCP我们还需要QUIC?
在三十年前,我们见证了显卡和网卡作为CPU的辅助外设的时代。然而,随着技术的发展,这些外设逐渐演变成了核心组件,GPU和SmartNIC现在在某些应用场景中扮演着类似CPU的角色。这种转变反映了硬件技术的进步和应用需求的变化。
程序员洲洲
2024/06/07
4430
[计算机网络]课程论文:万字长文详解QUIC协议,为什么有了TCP我们还需要QUIC?
QUIC 和 HTTP/3:提升网络性能的关键技术
QUIC(Quick UDP Internet Connections)是一种基于 UDP 的传输层协议,旨在解决 TCP 在高延迟和丢包环境下的性能问题。HTTP/3 则是 HTTP 协议的最新版本,它基于 QUIC 协议而非 TCP,以提供更高效、可靠的网络服务。
陆业聪
2024/09/26
7540
QUIC 和 HTTP/3:提升网络性能的关键技术
HTTP/3协议的安全优势与挑战
HTTP/3是超文本传输协议(HTTP)的第三个正式版本,将改善网络性能和稳定性,解决各种安全隐私问题,但尽管如此,仍存在一些安全挑战。
FB客服
2020/07/28
1.7K0
网络编程之快速读懂Http/3协议,一篇就够
HTTP3是HTTP协议的最新版本。从诞生之初,HTTP就是交换超文本文档的首选应用层协议。多年来,为了跟上互联网的发展,以及WWW上交换的内容种类增加,HTTP进行了几次重大升级,而HTTP/3就是目前的最新版本。
大忽悠爱学习
2022/05/06
6690
网络编程之快速读懂Http/3协议,一篇就够
HTTP/3来了!存续二十多年的TCP协议最终被抛弃!
6 月 6 日,IETF QUIC 和 HTTP 工作组成员 Robin Marx 宣布,经过 5 年的努力,HTTP/3 被标准化为 RFC 9114,这是 HTTP 超文本传输协议的第三个主要版本。同时,HTTP/2 也更新为 RFC 9113标准,HTTP/1.1 和通用 HTTP 语义和缓存概念在 RFC 9110-9112 中也得到了加强。 TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”T
SDNLAB
2022/07/19
1.2K0
HTTP/3来了!存续二十多年的TCP协议最终被抛弃!
MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力
本文将通过对 MQTT over QUIC 的详细解析,为大家展现这一领先技术实现对于物联网场景的优势与价值,帮助大家更有效地借助 EMQX 5.0 对 QUIC 的支持能力,在各类 MQTT 应用场景中进行更加高效、低成本的物联网数据传输。
EMQ映云科技
2022/07/29
7380
QUIC和互联网传输的未来
 点击上方“LiveVideoStack”关注我们 翻译:Alex 技术审校:刘连响 本文来自Compira Labs,作者为Ravid Hadar。 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 ---- QUIC 影音探索 #011# 当上世纪70年代TCP被发明的时候,我想没有人会预料到50年之后我们仍然在使用它。但事实是,我们现在还在使用TCP。 在过去几十年中,TCP不断发展,并新增了与可靠数据传输、流量控制、拥塞控制等相关的各种特性。但许多研究者以及包括我在内的从业者都
LiveVideoStack
2022/06/09
5320
QUIC和互联网传输的未来
网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!
本文中文译文由作者“ably.io”发布于公众号“高可用架构”,译文原题:《深入解读HTTP3的原理及应用》、英文原题:《HTTP/3 deep dive》(文末有译文和原文链接),即时通讯网收录时有少许改动,感谢原作者和译者的分享。
JackJiang
2020/06/03
6150
QUIC协议原理浅解
导语 | QUIC,HTTP3 的传输层实现,是近年来诞生的非常强悍的传输协议,它利用 UDP 解决了当前基于 TCP 协议的 HTTP 的许多问题,提升了在弱网环境下的网络通信体验,下面让我们来一探究竟。文章作者:江炜隆,腾讯云CDN产品研发工程师。 一 、QUIC究竟是什么 1. 什么是QUIC? QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于 UDP 的传输协议,它实现了 TCP + HTTPS + HTTP/2 的功能,目的是保证可靠性的同时降低
腾讯云开发者
2021/03/16
4.1K0
WebTransport初探
导语 | 如今通过网络进行实时音视频通话已经越来越流行,对于音视频领域的技术要求也越来越高,许多网络技术应运而生,如WebRTC,QUIC,HTTP3,WebTransport,WebAssembly,WebCodecs等。想必很多人有疑问,这些技术为什么会产生?有哪些发展历史?这些问题在本文都能找到参考。 QUIC简析 1. 什么是QUICQUIC(Quick UDP Internet Connections)是一种新的“更快”的通用网络传输协议。相比于TCP和TLS,QUIC提供了许多改进来提升网络传
腾讯云音视频
2022/03/04
2.5K0
HTTP/3发布了,我们来谈谈HTTP/3
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/17
7140
HTTP/3发布了,我们来谈谈HTTP/3
QUIC协议的演进之路
当通过网络传输数据时,一种新的协议QUIC(Quick UDP Internet Connection,快速UDP互联网连接)正在成为FAANG的默认选择。本篇文章描述了QUIC协议是如何克服其他版本HTTP的限制脱颖而出的。
LiveVideoStack
2021/08/27
5840
QUIC协议的演进之路
DH 算法,QUIC协议和HTTP3.0
Diffie和Hellman两位作者于1976年提出了一种的密钥交换协议。这种加密算法主要用于密钥的交换,能够实现了在非安全网络下通信双方密钥的安全建立,从而使通信双方能够使用这个密钥进行消息的加密解密,从而实现通信的安全。
zhangjiqun
2024/12/17
1460
DH 算法,QUIC协议和HTTP3.0
互联网协议正在发生变化
当上世纪九十年代互联网开始被广泛使用的时候,其大部分的通讯只使用几个协议:IPv4 协议路由这些数据包,TCP 协议转发这些包到连接上,SSL(及后来的 TLS)协议加密连接,DNS 协议命名那些所要连接的主机,而 HTTP 协议是最常用的应用程序协议。
Debian中国
2018/12/20
4290
从HTTP到QUIC:网络协议的演进与优化
随着互联网的快速发展,网络协议已经经历了从HTTP、HTTP/1.1、HTTP/2到QUIC的演进。本文将详细阐述这些协议的原理及其演进过程,帮助读者更好地了解网络协议的发展历程和各自的优缺点。
陆业聪
2024/07/23
2340
从HTTP到QUIC:网络协议的演进与优化
STGW 下一代互联网标准传输协议QUIC大规模运营之路
作者:wentaomao,腾讯 TEG 后台开发工程师 前言 QUIC 作为互联网下一代标准传输协议,能够明显提升业务访问速度,提升弱网请求成功率以及改善网络变化场景下的平滑体验。 STGW 作为公司级的 7 层接入网关以及腾讯云 CLB(负载均衡器)的底层支撑框架,每天都为公司内部业务和腾讯云外部客户提供数万亿次的请求服务,对请求处理的性能、传输效率、运营的可靠性都有非常严苛的要求。 本文主要介绍 STGW 大规模运营 QUIC 过程中的一些经验和开发工作。 QUIC 简介 QUIC 的诞生和发展
腾讯技术工程官方号
2021/02/02
3.9K0
看 B 站,可以更快!
现在用谷歌浏览器看 B 站视频,默认是用 HTTP/2 协议,它相比 HTTP/1.1 性能提高很多,但是其实看 B 站视频还能更快!
小林coding
2021/03/15
1.4K0
未来可期的HTTP/3
2015 年 HTTP/2 标准发表后,大多数主流浏览器也于当年年底支持该标准。此后,凭借着多路复用、头部压缩、服务器推送等优势,HTTP/2 得到了越来越多开发者的青睐,不知不觉的 HTTP 已经发展到了第三代。本文基于兴趣部落接入 HTTP/3 的实践,聊一聊 HTTP/3 的原理以及业务接入的方式。
Nealyang
2020/06/04
5920
未来可期的HTTP/3
HTTP3 RFC 9114 发布,深入剖析HTTP3协议
HTTP3是在保持QUIC稳定性的同事使用UDP来实现高速度, 同时又不会牺牲TLS的安全性.
肉眼品世界
2022/06/15
1.2K0
HTTP3 RFC 9114 发布,深入剖析HTTP3协议
相关推荐
http 3.0 QUIC 方案你知道多少?
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 一、基本异常处理策略
  • 二、通过自定义Action处理异常
  • 三、通过配置的Error View处理异常
  • 四、自定义ActionInvoker:ExceptionActionInvoker
  • 五、自定义Controller:BaseController
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档