当前位置: 首页 > news >正文

索引网站有哪些东营垦利

索引网站有哪些,东营垦利,织梦文章采集到wordpress,中信银行门户网站系统文章目录 中间件#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过… 文章目录 中间件掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过滤 ExceptionFilterAttribute2.1.5 异常处理技巧总结 3 静态文件中间件: 前后端分离开发合并部署3.1 静态文件中间件的能力3.2 注册使用非www.root目录 4 文件提供程序:将文件放在任何地方4.1 文件提供程序核心类型4.2 内置文件提供程序 中间件掌控请求处理过程的关键 1. 中间件 1.1 中间件工作原理 1.2 中间件核心对象 IApplicationBuilderRequestDelegate IApplicationBuilder可以通过委托方式注册中间件委托的入参也是委托这就可以将这些委托注册成一个链如上图所示最终会调用Builder方法返回一个委托这个委托就是把所有的中间件串起来后合并成的一个委托方法Builder的委托入参是HttpContext实际上所有的委托都是对HttpContext进行处理 RequestDelegate是处理整个请求的委托。 中间件的执行顺序和注册顺序是相关的 //注册委托方式,注册自己逻辑// 对所有请求路径app.Use(async (context, next) {await next();await context.Response.WriteAsync(Hello2);});// 对特定路径指定中间件,对/abc路径进行中间件注册处理app.Map(/abc, abcBuilder {// Use表示注册一个完整的中间件,将next也注册进去abcBuilder.Use(async (context, next) {await next();await context.Response.WriteAsync(abcHello);});});// Map复杂判断,判断当前请求是否符合某种条件app.MapWhen(context {return context.Request.Query.Keys.Contains(abc);}, builder {// 使用Run表示这里就是中间件的执行末端,不再执行后续中间件builder.Run(async context {await context.Response.WriteAsync(new abc);});});应用程序一旦开始向Response进行write时,后续的中间件就不能再操作Head,否则会报错 可以通过context.Resopnse.HasStarted方法判断head是否已经被操作 设计自己的中间件 中间件的设计时才有的约定的方式即在方法中包含Invoke或者InvokeAsync如下 public class MyMiddleware{private readonly RequestDelegate next;private readonly ILoggerMyMiddleware logger;public MyMiddleware(RequestDelegate next,ILoggerMyMiddleware logger){this.next next;this.logger logger;}public async Task InvokeAsync(HttpContext context){using (logger.BeginScope(TraceIndentifier:{TraceIdentifier},context.TraceIdentifier)){logger.LogDebug(Start);await next(context);logger.LogDebug(End);}}}public static class MyBuilderExtensions {public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder app){return app.UseMiddlewareMyMiddleware();} }// 中间件使用 app.UseMyMiddleware(); 2.异常处理中间件:区分真异常和逻辑异常 2.1 处理异常的方式 异常处理页异常处理匿名委托方法IExceptionFilterExceptionFilterAttribute // startup中的Configureif (env.IsDevelopment()){app.UseDeveloperExceptionPage();// 开发环境下的异常页面,生产环境下是需要被关闭,页面如下图所示app.UseSwagger();app.UseSwaggerUI(c c.SwaggerEndpoint(/swagger/v1/swagger.json, LoggingSerilog v1)); } 2.1.1 日常错误处理–定义错误页的方法 // startup中的Configure app.UseExceptionHandler(/error);// 控制器 public class ErrprController : Controller {[Route(/error)]public IActionResult Index(){// 获取上下文中的异常var exceptionHandlerPathFeature HttpContext.Features.GetIExceptionHandlerPathFeature();var ex exceptionHandlerPathFeature?.Error;var knowException ex as IKnowException;if(knowException null){var logger HttpContext.RequestServices.GetServiceILoggerMyExceptionFilterAttribute();logger.LogError(ex,ex.Message);knowException KnowException.Unknow;}else{knowException KnowException.FromKnowException(knowException);}return View(knowException);} }// 定义接口 public interface IKnowException {public string Message {get;}public int ErrorCode {get;}public object[] ErrorData {get;} }// 定义实现 public class KnowException : IKnowException {public string Message {get;private set;}public int ErrorCode {get;private set;}public object[] ErrorData {get;private set;}public readonly static IKnowException Uknow new KnowException{Message 未知错误,ErrorCode 9999};public static IKnowException FromKnowException(IKnowException exception){return new KnowException{Message exception.Message,ErrorCode exception.ErrorCode,ErrorData exception.ErrorData};} }// 需要定义一个错误页面 index.html,输出错误Message和ErrorCode2.1.2 使用代理方法处理异常 // startup中的Configure app.UseExceptionHandler(errApp {errApp.Run(async context {var exceptionHandlerPathFeature HttpContext.Features.GetIExceptionHandlerPathFeature();var ex exceptionHandlerPathFeature?.Error;var knowException ex as IKnowException;if(knowException null){var logger HttpContext.RequestServices.GetServiceILoggerMyExceptionFilterAttribute();logger.LogError(exceptionHandlerPathFeature.Error,exceptionHandlerPathFeature.Error.Message);knowException KnowException.Unknow;context.Response.StatusCode StatusCodes.Status500InternalServerError;}else{knowException KnowException.FromKnowException(knowException);context.Response.StatusCode StatusCodes.Status200OK;}var jsonOptions context.RequestServices.GetServiceOptionsJsonOptions();context.Response.ContextType application/json;charsetutf-8;await context.Response.WriteAsync(System.Text.Json.JsonSerializer(knowException,jsonOptions.Value));}); }); 未知异常输出Http500响应已知异常输出Http200 因为监控系统会对Http响应码进行识别如果返回的500比率比较高的时候会认为系统的可用性有问题告警系统会发出警告。对已知异常进行200响应能够让告警系统正常运行能够正确识别系统一些未知的错误使告警系统更加灵敏避免了业务逻辑的异常干扰告警系统 2.1.3 异常过滤器 IExceptionFilter 异常过滤器是作用在整个MVC框架体系之下在MVC整个声明周期中发生作用也就是说它只能工作早MVC Web Api的请求周期里面 // 自定义异常过滤器 public class MyException : IExceptionFilter {public void OnException(ExceptionContext context){IKnowException knowException context.Exception as IKnowException;if(knowException null){var loger context.HttpContext.RequestServices.GetServiceILoggerMyExceptionFilterAttribute();logger.LogError(context.Exception,context.Exception.Message);knowException KnowException.UnKnow;context.HttpContext.Response.StatusCode StatusCodes.Status500InternalServerError;}else{knowException KnowException.FromKnowException(knowException);context.HttpContext.Response.StatusCode StatusCodes.Status200OK;}context.Result new JsonResult(knowException){ContextType application/json:charsetutf-8}} }// startup注册 public void ConfigureServices(IServiceCollection services) {services.AddMvc(mvcoption {mvcOptions.Filters.AddMyExceptionFilter();}).AddJsonOptions(jsonOptions {jsonOptions.JsonSerializerOptions.Encoder System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscapt}); } 2.1.4 特性过滤 ExceptionFilterAttribute public class MyExceptionFilterAttriburte : ExceptionFilterAttribute {public override void OnException(ExceptionContext context){IKnowException knowException context.Exception as IKnowException;if(knowException null){var logger context.HttpContext.RequestServices.GetServicesILoggerMyExceptionFilterAttribute();logger.LogError(context.Exception,context.Exception.Message);knowException KnowException.UnKnow;context.HttpContext.Response.StatusCode StatusCodes.Status500InternalServerError;}else{knowException KnowException.FromKnowException(knowException);context.HttpContext.Response.StatusCode StatusCodes.Status200OK;}context.Result new JsonResult(knowException){ContextType application/json:charsetutf-8}} }// 使用方式 在Controller控制器上方标注[MyExceptionFilter] 或者在 startup中ConfigureServices注册 services.AddMvc(mvcoption {mvcOptions.Filters.AddMyExceptionFilterAttribute();});2.1.5 异常处理技巧总结 用特定的异常类或接口表示业务逻辑异常为业务逻辑异常定义全局错误码为未知异常定义定义特定的输出信息和错误码对于已知业务逻辑异常响应HTTP 200(监控系统友好)对于未预见的异常响应HTTP 500为所有的异常记录详细的日志 3 静态文件中间件: 前后端分离开发合并部署 3.1 静态文件中间件的能力 支持指定相对路径支持目录浏览支持设置默认文档支持多目录映射 // startup的Configure方法中 app.UseDefaultFiles();// 设置默认访问根目录文件index.html app.UseStaticFiles();// 将www.root目录映射出去 如果需要浏览文件目录,需要如下配置 // startup中的ConfigureServices中配置 services.AddDirectoryBrowser();// startup的Configure方法中 app.UseDirectoryBrowser(); app.UseStaticFiles(); 3.2 注册使用非www.root目录 // startup的Configure方法中 app.UseStaticFiles();app.UseStaticFiles(new StaticFileOptions {// 将程序中名为file文件目录注入RequestPath /files,// 设置文件指定访问路径,将文件目录映射为指定的Url地址FileProvider new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),file)) }); 实际生产中会遇到将非api请求重定向到指定目录,采用如下配置 // startup的Configure方法中 app.MapWhen(context {return !context.Request.Path.Value.StartWith(/api); },appBuilder {var option new RewriteOptions();option.AddRewrite(.*,/index.html,true);appBuilder.UseRewriter(option);appBuilder.UseStaticFiles(); });4 文件提供程序:将文件放在任何地方 4.1 文件提供程序核心类型 IFileProviderIFileInfoIDirectoryContexts 4.2 内置文件提供程序 PhysicalFileProvider⇒ 物理文件提供程序EmbeddedFileProvider ⇒ 嵌入式文件提供程序CompositeFileProvoder ⇒ 组合文件提供程序,将各种文件程序组合成一个目录 // 映射指定目录文件- 物理文件 IFileProvider provider1 new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory); // 获取文件目录下内容 var contents provider1.GetDirectoryContents(/); // 输出文件信息 foreach (var item in contents) {var stream item.CreateReadStream();// 获取文件流Console.WriteLine(item.Name); }// 嵌入式文件 IFileProvider fileProvider2 new EmbeddedFileProvider(typeof(Program).Assembly); var html fileProvider2.GetFileInfo(file.html);// file.html文件属性设置为嵌入的资源// 组合文件提供程序 IFileProvider fileProvider3 new CompositeFileProvider(provider1,fileProvider2); var contexts3 fileProvider3.GetDirectoryContents(/);
http://wiki.neutronadmin.com/news/165916/

相关文章:

  • 网站主持人制作网站代言人网站系统怎么做
  • 如何在网站上做社交的链接微信端网站设计规范
  • 如何构建一个成交型网站wordpress 商品设置
  • 网站原型图展示wordpress微信登录设置密码
  • 管理网站精品网站建设费用 c磐石网络
  • 制作单页网站公司网络营销策略
  • 网站页面是自己做还是使用模板做视频可以领钱的网站
  • 建立网站编码 优帮云网站建设项目进度计划书
  • 网站建设全部教程运营说白了是什么意思
  • 网站建设项目心得体会网站管理后台制作
  • 注册完域名 如何做网站地方做什么网站
  • 怎样吧自己做的网站发布网络优化怎么自己做网站
  • 网站内部建设和程序wordpress 3.2 下载地址
  • 北京建设银行纪念钞预定官方网站东莞网页设计制作
  • 网站怎么做能中英文的iis搭建本地网站
  • 陕西省建设教育培训中心网站asp美食网站源码
  • 有没有免费开网站的购买域名后 可以做网站么
  • 深圳建站公司哪个济南兴田德润简介遵义市做网站的地方
  • 富德生命人寿保险公司官方网站保单查询南宁网络
  • 做网站外包公司有哪些做服装团购有哪些网站
  • 2021不良正能量免费网站app对网站的建议和优化
  • 做网站来钱快北京高端网站建设有限公司
  • 设计一个网站的价格表新冠咳嗽吃什么药
  • 南京企业网站建设网络公司有几家
  • 邢台高端网站建设公司建筑设计费一般多少钱一平方
  • 新乡网站建设制作报价方案什么网站做旅行计划
  • 网站开发关于安全问题去哪里做网站
  • 十堰做网站公司哈尔滨企业网站seo
  • 惠州网站公司清远做网站公司
  • 有什么网站可以做电子版邀请函电子商务网站开发需求文档