1.如何在ASP.NETCore6中使用跟踪监听器
2.详解.NET Model ValidationAttributeç使ç¨
如何在ASP.NETCore6中使用跟踪监听器
当使用ASP.NETCore6构建的源码应用程序时,你可能经常想使用跟踪和记录来监控你的源码应用程序的性能和诊断错误。你也可以在生产环境中使用跟踪来衡量你的源码应用程序在运行时的表现。这篇文章讨论了我们如何在ASP.NETCore6中使用追踪。源码我们将研究如何使用跟踪监听器来收集跟踪信息,源码并使用ILogger将跟踪输出引导到事件日志中。源码-128源码
要使用本文提供的源码代码示例,你的源码系统中应该安装有VisualStudio。如果你还没有副本,源码你可以在这里下载VisualStudio。源码
在VisualStudio中创建一个ASP.NETCoreWebAPI项目首先,源码让我们在VisualStudio中创建一个ASP.NETCore项目。源码按照这些步骤将在VisualStudio中创建一个新的源码无忧派单源码ASP.NETCore6WebAPI项目。
启动VisualStudioIDE。源码
点击"创建新项目"。源码
在"创建新项目"窗口,从显示的模板列表中选择"ASP.NETCoreWebAPI"。
点击"下一步"。
在"配置你的新项目"窗口中,指定新项目的名称和位置。
根据你的喜好,可以选择勾选"将解决方案和项目放在同一目录下"复选框。
点击"下一步"。
在接下来显示的"附加信息"窗口中,确保勾选"使用控制器..."的无忧源码房卡复选框,因为我们在这个例子中不会使用最小的API。将"验证类型"保留为"无"(默认)。
确保"启用Docker"、"为HTTPS配置"和"启用开放API支持"的复选框不被选中,因为我们不会在这里使用任何这些功能。
点击创建。
我们将使用这个ASP.NETCore6WebAPI项目,在本文的后续部分使用跟踪监听器。
什么是跟踪?与追踪主要事件的事件日志相比,追踪可以更全面地了解运行中的应用程序及其组件。日志由结构化或非结构化的时间戳数据组成,显示了你的低位突破指标源码应用程序中发生的事件的记录。追踪提供了对单个请求以及它如何被处理的更多可见性。
System.Diagnostics命名空间包含Trace和Debug类。跟踪类在生产环境中使用,而调试类在开发时使用。
追踪通常包括以下三个阶段。
工具化。我们编写必要的代码来捕获相关信息
追踪。我们把跟踪信息写到指定的目标,即事件日志、文本文件、数据库表等。
分析。apk护航者源码我们分析从跟踪中收集到的信息,以确定应用程序中的瓶颈。
什么是跟踪监听器?为什么需要它们?跟踪监听器收集跟踪信息,存储它们,并将它们引导到一个适当的目标,如文本文件。.NET提供了几种跟踪监听器,包括以下几种。
ConsoleTraceListener-将跟踪信息发送到控制台窗口。
DefaultTraceListener-将跟踪信息发送到标准调试输出。
DelimitedListTraceListener-将跟踪输出以限定的格式发送到流、流作家或文本作家。
EventLogTraceListener-发送跟踪信息到事件日志。
TextWriterTraceListener-发送跟踪信息到一个文本文件。
XmlWriterTraceListener-将跟踪信息转换为XML。
System.Diagnostics.Debug和System.Diagnostics.Trace类可以向跟踪监听器发送消息,而监听器又将消息发送到适当的目标。
在ASP.NETCore6中使用配置文件创建一个跟踪监听器你可以通过使用配置文件或编写自定义代码来创建一个跟踪监听器。下面显示的代码片断说明了如何使用你的应用程序配置文件创建一个跟踪监听器。
<configuration>所有添加到监听器集合中的监听器都会收到跟踪输出。然而,你可以使用一个监听器而不把它添加到监听器集合中。在这种情况下,你在监听器中使用Write或WriteLine方法发送输出。
下面的代码说明了一个监听器,它没有被添加到监听器集合中,但仍然能够将跟踪信息发送到输出窗口、文件或任何预先配置的输出。
TextWriterTraceListenermyFirstListener=new在ASP.NETCore6中创建一个自定义跟踪监听器在大多数情况下,.NET6默认附带的跟踪监听器将满足您的要求。然而,如果你想把你的跟踪信息输出到不同的目的地,你可以实现你自己的跟踪监听器。
要建立一个自定义的跟踪监听器,你应该创建一个扩展TraceListener抽象类的类。在TraceListener类中有几个虚拟和抽象的方法。你至少应该实现Write和WriteLine方法。至少,你的自定义跟踪监听器应该看起来像这样。
publicclassCustomTraceListener:TraceListener所以,你的自定义跟踪监听器类必须有一个参数构造器和Write和WriteLine方法。
你还需要一个ILogger实例来代表记录器,一个记录器工厂来创建记录器,以及一个StringBuilder来存储跟踪消息,然后再将它们发送到日志目标。
privatereadonlyILoggerFactory_loggerFactory;你可以利用依赖注入的优势,在构造函数中注入ILoggerFactory的一个实例,然后使用该实例来创建ILogger的一个实例。
publicCustomTraceListener(ILoggerFactoryloggerFactory)这里是Write和WriteLine方法的一个最小实现。
publicoverridevoidWrite(string?message,string?category)ASP.NETCore6中完整的自定义跟踪监听器示例下面是我们对自定义跟踪监听器的最小实现的完整源代码,供您参考。
usingSystem.Collections.Concurrent;在Program.cs文件中注册自定义跟踪监听器要使用自定义跟踪监听器,你应该使用以下代码在监听器集合中注册它。
varloggerFactory=app.Services.GetRequiredService<ILoggerFactory>();因为我们的自定义跟踪监听器已经被添加到监听器集合中,它将捕获所有由运行时产生的跟踪消息,并将输出发送到我们的记录器。它还将发送我们在应用程序中明确发送的任何跟踪消息(就像我们在前面的myFirstListener例子中做的那样)。
因此,任何添加到监听器集合的监听器都可以捕获由运行时产生的跟踪信息,以及在应用程序中明确发送的任何跟踪信息。然而,如果一个跟踪监听器没有被添加到集合中,它只能发送应用程序中明确发送的跟踪消息。它不会捕获任何由运行时产生的跟踪消息。
当使用自定义跟踪监听器时,你必须记住关闭或刷新跟踪监听器,以确保输出缓冲区被清空。你可以利用StringBuilderCache类来优化你使用StringBuilder的代码(在CustomTraceListener类)。
详解.NET Model ValidationAttributeç使ç¨
ä¸ãç®ä»
ValidationAttribute éªè¯ç¹æ§ä¸è¬ç¨æ¥éªè¯æ°æ®çæ ¼å¼ï¼èå´ï¼æ¯å¦å¿ å¡«çï¼æ们éè¿å®çåç±»ç¹æ§ RangeãRequired çç¹æ§å¯ä»¥è½»æ¾å®ç°å¯¹æ°æ®çéªè¯ãä½æ¯å¯¹äºä¸äºç¹æ®éè¦çç¹æ§ï¼ç³»ç»èªå¸¦çç¹æ§å±éæ§å¾å¤§ï¼æ们ä¹å¯ä»¥èªå®ä¹æ©å±éè¦çç¹æ§ã ?
äºãASP.NET åºç¨ValidationAttribute åºç¨å¨ ASP.NET MVC ä¸æ¯å¸¸ç¨å¾ï¼ç¨äºå¯¹ HTPP Request åæ°å段å¾æ ¡éªï¼ä¸éè¿å¾ä¼è¿å æ示ç»è°ç¨æ¹ãæ¥ä¸éè¿ä¸ä¸ªç®åä¾åè¿è¡è¯´æä¸ä¸ï¼ä¾å使ç¨å¾æ¯ .NET Web API ã
2.1 Modelé¦å å®ä¹ä¸ä¸ª request model æ·»å ä¸äºå段ï¼å¦ Name æä¸ RequiredãMinLengthãMaxLength è¿æ ·çæ è®°è¿è¡éå¶
public?class?PersonalRequest{ public?int?Id?{ ?get;?set;?}[Required][MinLength(2),?MaxLength()]public?string?Name?{ ?get;?set;?}public?string?Sex?{ ?get;?set;?}[Required][MinLength(2),?MaxLength()]public?string?Address?{ ?get;?set;?}}2.2 Controllerå®ä¹å® request ?model åï¼å建ä¸ä¸ª ?API ï¼å°ä¸ä¸æ¥å®ä¹ç request model ä½ä¸ºåæ°ãæ¤æ¶å¨ request ?model å段ä¸æç ?RequiredãMinLengthãMaxLength æ è®°ï¼æ¯æ²¡æä»»ä½ä½ç¨çã
[HttpPost][Route("WebAPIApply")]public?IActionResult?WebAPIApply(PersonalRequest?request){ return?Ok();}2.4 Filter为äºè®© request ?model å段ä¸æç ?RequiredãMinLengthãMaxLength æ è®°çæï¼ MVC ä¸éè¦ä½¿ç¨å° Filter ã代ç å¦ä¸
public?class?ModelValidateFilter?:?IAsyncActionFilter{ public?async?Task?OnActionExecutionAsync(ActionExecutingContext?context,?ActionExecutionDelegate?next){ if?(!context.ModelState.IsValid){ var?allErrors?=?context.ModelState.Values.SelectMany(v?=>?v.Errors);var?message?=?string.Join("?|?",?allErrors.Select(e?=>?e.ErrorMessage));context.Result?=?new?JsonResult(new?{ ?results?=?allErrors?});}await?next();}}2.5 注åFilter å建å®æåï¼éè¦æ³¨åä¸ä¸ï¼è¿éæ们使ç¨å ¨å±æ¨¡å¼ãå¦ä¸
builder.Services.AddMvc(opt?=>{ opt.Filters.Add(new?ModelValidateFilter());});2.6 éªè¯ç¨åºå建å®æåï¼è°ç¨ API éªè¯ä¸ä¸ï¼å¦ä¸å¯¹ Name åå«èµå¼äº D Daã å¯ä»¥çå°å½æ¯ D çæ¶åï¼å段é¿åº¦ä¸º 1 ï¼filter 对 request ?model è¿è¡äºæ£ç¡®çæ ¡éª
ä¸ãç´æ¥éªè¯å®ä¾ç´æ¥éªè¯å®ä¾ï¼æ¯æå¯ä»¥å¯¹å®ä¹ model çå®ä¾ï¼èªå®ä¹ä»£ç 对é½è¿è¡æ ¡éªï¼è¿ç§ä½¿ç¨èµ·æ¥ç¸å¯¹çµæ´»ï¼ä½ä¹ä¸ç»å¸¸ä½¿ç¨ãæ¥ä¸éè¿ä¸ä¸ªç®åä¾åè¿è¡è¯´æä¸ä¸
3.1 Modelé¦å å®ä¹ä¸ä¸ª model æ·»å ä¸äºå段ï¼å¦ Name æä¸ RequiredãMinLengthãMaxLength è¿æ ·çæ è®°è¿è¡éå¶
public?class?Personal{ [Required]public?int?ID?{ ?get;?set;?}[Required][MinLength(2),?MaxLength(5)]public?string?Name?{ ?get;?set;?}}3.2 Validation Codeæ ¡éªä»£ç å¦ä¸ï¼å 对å®ä¹ç model è¿è¡äºå®ä¾åï¼ç¶åä½¿ç¨ Validator.TryValidateObject æ¹æ³è¿è¡æ ¡éªï¼å®é å·¥ä½ä¸éè¦èªå·±è¿è¡ä¸äºå°è£ ãå ³é®ä»£ç å¦ä¸ï¼
Personal?personal?=?new?Personal();//?personal.Name?=?"D";ValidationContext?validationContext?=?new?ValidationContext(personal);List<ValidationResult>?results?=?new?List<ValidationResult>();bool?isValid?=?Validator.TryValidateObject(personal,?validationContext,?results,?true);3.3 éªè¯ä»£ç åå®åï¼è°ç¨ API éªè¯ä¸ä¸ãé¦å ç´æ¥è°ç¨ï¼åºä¸ºä»£ç éé¢æ²¡æ对 Personal å®ä¾èµå¼ï¼æ£ç¡®çè¿è¡äº Required æ è®°çæ ¡éªå¯ä»¥ä¿®æ¹ä¸ä»£ç ?personal.Name = "Da"ï¼ç¶åå¯å¨ç¨åºï¼è°ç¨ä¸ä¸ API å¯ä»¥çå°æ ¡éªæ¯éè¿çå¯ä»¥ä¿®æ¹ä¸ä»£ç ?personal.Name = "D"ï¼ç¶åå¯å¨ç¨åºï¼è°ç¨ä¸ä¸ API å¯ä»¥çå°æ ¡éªæ¯ä¸éè¿çï¼å 为é¿åº¦ä¸º 1 没æ满足 MinLength(2)
åãèªå®ä¹ ValidationAttributeé¤äºå¯ä»¥ä½¿ç¨ Microsoft æä¾ç ValidationAttribute ï¼æ们è¿å¯ä»¥ä½¿ç¨èªå®ä¹ç ValidationAttribute ï¼å¾®è½¯è¿æ¹é¢æä¾äºå¯æ©å±æ§ãèªå®ä¹ç ValidationAttribute åªéç»§æ¿ ValidationAttributeï¼éå IsValid ãFormatErrorMessage å³å¯ã使ç¨æ¹é¢ä¸ Microsoft æä¾ç ValidationAttribute 使ç¨ä¸æ¨¡ä¸æ ·ãå¦ä¸ä»£ç
public?class?CanToIntAttribute?:?ValidationAttribute{ ///?<summary>///?IsValid?为?false?æ¶ï¼æ示å¾?error?ä¿¡æ¯///?</summary>///?<param?name="name"></param>///?<returns></returns>public?override?string?FormatErrorMessage(string?name){ return?$"{ name}?need?to?int";}///?<summary>///?éªè¯å½åå段å¾ç»æ///?</summary>///?<param?name="value"></param>///?<returns></returns>public?override?bool?IsValid(object?value){ int?num?=?0;return?int.TryParse(Convert.ToString(value),?out?num);}}public?class?PersonalRequest{ public?int?Id?{ ?get;?set;?}public?string?Name?{ ?get;?set;?}[CanToInt]public?string?Sex?{ ?get;?set;?}[Required][MinLength(2),?MaxLength()]public?string?Address?{ ?get;?set;?}}äºãæºç /post/