context

.net core webapi Controller中处理http请求和响应

时光怂恿深爱的人放手 提交于 2020-03-23 18:18:01
在实际工作中,企业框架往往对Http请求和响应的body制定了一定的规范,这样每次编写Controller中Action方法时,有以下两个问题要解决: 都要解析请求报文以获取有用的参数 在返回时,根据规范去包装响应内容 为了减少工作量,我们可以编写一段通用的代码,在请求的时候对请求body进行解析,在响应的时候对body进行包装。 我这里采用的方式是在自己写Controller类上加一个自定义的特性[HttpMessageAttribute],这个特性继承自[ActionFilterAttribute],[ActionFilterAttribute]特性有以下几个常用的虚方法: #region 程序集 Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 #endregion //在Action执行之后调用 public virtual void OnActionExecuted(ActionExecutedContext context) { } //在Action执行之前调用 public virtual void OnActionExecuting(ActionExecutingContext context) { } /

Async,Await和ConfigureAwait的关系

泪湿孤枕 提交于 2020-03-23 15:49:56
【转自】https://mp.weixin.qq.com/s/h10V-FshGoaQUWFPfy-azg 在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用。为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程。虽然async / await让异步编程更简单,但是有一些你可能不知道的细节和注意的地方 新关键字 微软在.NET框架中添加了async和await关键字。但是,使用它们,方法的返回类型应为Task类型。(我们将在稍后讨论例外情况)为了使用await关键字,您必须在方法定义中使用async。如果你在方法定义中放入async,你应该在主体方法的某个地方至少有一处await关键字,如果你缺少他,你通常会收到Visual Studio的一个警告。 以下是代码中的示例: 1 public async Task ExecuteAsync(UpdateCarCommand request, CancellationToken token = default) 2 { 3 using (var context = _contextFactory.Create()) 4 { 5 var entity = context.Cars.FirstOrDefault(a => a.Id == request

抄写原生项目_day02

安稳与你 提交于 2020-03-23 12:20:39
3 月,跳不动了?>>> 非常粗糙的模仿spring扫描注解,先定义三个注解 @Retention (RetentionPolicy. RUNTIME ) @Target (ElementType. TYPE ) public @ interface Controller { } @Retention (RetentionPolicy. RUNTIME ) @Target (ElementType. METHOD ) public @ interface RequestMapping { String value () ; } @Retention (RetentionPolicy. RUNTIME ) @Target (ElementType. TYPE ) public @ interface Service { } 在监听中进行扫描并加入到context容器之中 public void contextInitialized (ServletContextEvent servletContextEvent) { // 获取容器配置并初始化 ServletContext servletContext = servletContextEvent.getServletContext() ; String initParameter = servletContext

Razor模板引擎

安稳与你 提交于 2020-03-23 07:39:55
1  Razor模板引擎的使用:     (1)常用三种模板引擎:       Razor 解释执行,微软内置、有提示,与JavaScript存在兼容性;       Nvelocity / Vtemplate 运行时动态执行,(比Razor更好)。     (2)Razor引擎的使用:        <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <h1>胡安定</h1> <div> <h2>@Model.Name</h2> <h2>@Model.Age</h2> </div> <div> <ul> @for (var i = 0; i < 10;i++ ) { <li>@i</li> } </ul> </div> </body> </html> razor1.cshtml using RazorEngine; using System; using System.Collections.Generic; using System.IO; using System.Linq; using

asp.net core mvc剖析:路由

若如初见. 提交于 2020-03-23 07:35:51
在mvc框架中,任何一个动作请求都会被映射到具体控制器中的方法上,那框架是如何完成这样一个过程的,现在我们就来简单分析下流程。 我们紧跟上面的主题,任何一个请求都会交给处理管道进行处理,那mvc处理的流程自然也应该处于这个管道中,在startup.cs文件的Configure方法中,我们会看到这样的代码 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}", defaults: new { area = "admin" }); });   这部分代码的作用我们都清楚,就是配置路由规则,把用户的请求,路由到控制器方法上,我们来看它里面怎么做到的。首先看下UseMvc方法,直接上代码: public static IApplicationBuilder UseMvc( this IApplicationBuilder app, Action<IRouteBuilder> configureRoutes) { 。。。。。。 //实例化路由构造器 var routes = new RouteBuilder(app) { //设置默认处理器,就是路由符合条件时使用MvcRouteHandler来处理请求 DefaultHandler

ASP.NET Core 中间件基本用法

青春壹個敷衍的年華 提交于 2020-03-23 07:34:05
原文: ASP.NET Core 中间件基本用法 ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件。中间件按照装配的先后顺序执行,并决定是否进入下一个组件。中间件管道的处理流程如下图(图片来源于官网): 管道式的处理方式,更加方便我们对程序进行扩展。 使用中间件 ASP.NET Core中间件模型是我们能够快捷的开发自己的中间件,完成对应用的扩展,我们先从一个简单的例子了解一下中间件的开发。 Run 首先,我们创建一个ASP.NET Core 应用,在Startup.cs中有如下代码: app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); 这段代码中,使用Run方法运行一个委托,这就是最简单的中间件,它拦截了所有请求,返回一段文本作为响应。Run委托终止了管道的运行,因此也叫作 终端中间件 。 Use 我们再看另外一个例子: app.Use(async (context, next) => { //Do something here //Invoke next middleware await next.Invoke(); //Do something here }); 这段代码中

.net core 中间件管道底层剖析

假装没事ソ 提交于 2020-03-23 07:33:32
原文: .net core 中间件管道底层剖析 .net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core 的管道其实就是中间件的部分。 微软中间件文档 为什么管道就是中间件的部分了呢?我是这么理解的,.net core 是通过Startup 类配置服务和应用的请求管道,所以狭义点来讲这个管道就是指的请求管道,就是我们今天要理解的中间件管道。 .net core 核心体系结构的特点就是一个中间件系统,它是处理请求和响应的代码段。 中间件彼此链接,形成一个管道。 传入的请求通过管道传递,其中每个中间件都有机会在将它们传递到下一个中间件之前对它们进行处理。 传出响应也以相反的顺序通过管道传递。 PS:简单来讲就是请求开始到响应结束的中间的一大部分。你可以理解成 " 汽车销售 " (开始买车到提车的过程,但愿不会坐在奔驰车盖上哭),哈哈…… 还有我们来看看,为什么我们要简化来看,在运行时 .net core 会预先注入一些必要的服务及依赖项,默认注入(ServiceCollection)的服务清单如下: 我们先断章取义地看,这里面有 Kestrel 处理请求,将接收到的请求内容(字符串流)转化成结构化的数据(HttpContext

Net core学习系列(七)——Net Core中间件

时间秒杀一切 提交于 2020-03-23 07:32:48
一、什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件。 每个组件: 选择是否将请求传递给管道中的下一个组件。 可以在调用管道中的下一个组件之前和之后执行工作。 请求委托(Request delegates)用于构建请求管道,处理每个HTTP请求。 请求委托使用 Run , Map 和 Use 扩展方法进行配置。单独的请求委托可以以内联匿名方法(称为内联中间件)指定,或者可以在可重用的类中定义它。这些可重用的类和内联匿名方法是中间件或中间件组件。请求流程中的每个中间件组件都负责调用流水线中的下一个组件,如果适当,则负责链接短路。 将HTTP模块迁移到中间件解释了ASP.NET Core和以前版本(ASP.NET)中的请求管道之间的区别,并提供了更多的中间件示例。 使用 IApplicationBuilder 创建中间件管道 ASP.NET Core请求流程由一系列请求委托组成,如下图所示(执行流程遵循黑色箭头): 每个委托可以在下一个委托之前和之后执行操作。委托还可以决定不将请求传递给下一个委托,这称为请求管道的短路。短路通常是可取的,因为它避免了不必要的工作。例如,静态文件中间件可以返回一个静态文件的请求,并使管道的其余部分短路。需要在管道早期调用异常处理委托,因此它们可以捕获后面管道的异常。 最简单的可能是ASP.NET

Asp .Net core 2 学习笔记(2) —— 中间件

一个人想着一个人 提交于 2020-03-23 07:32:35
这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章里面一些局限于我自己知识积累的观点,希望没有跳走坚持看完的朋友,能够予以指正和鼓励. 系列目录 (1)Starup (2)中间件 (3)静态文件 中间件 中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件: 选择是否将请求传递到管道中的下一个组件 可在管道中的下一个组件前后执行工作 请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。 请求委托通过使用 IApplicationBuilder 类型的 Run、Map 以及 Use 扩展方法来配置,并在Starup类中传给configure方法 。每个单独的请求委托都可以被指定为一个 内嵌匿名方法,或其定义在一个可重用的类中。这些可重用的类被称作中间件或中间件组件。每个位于请求管道内的中间件组件负责调用管道中下一个组件,或适时短路调用链。 使用 IApplicationBuilder 创建中间件管道 ASP.NET Core 请求管道包含一系列请求委托,依次调用 这系列委托并不是一条路走到底:每个委托均可在下一个委托前后执行操作,使得请求管道短路. 短路的方式存在两种: 1任何委托都能选择停止传递到下一个委托

开发自定义控件的步骤

那年仲夏 提交于 2020-03-23 07:20:20
开发自定义控件的步骤: 1、了解View的工作原理 2、 编写继承自View的子类 3、 为自定义View类增加属性 4、 绘制控件 5、 响应用户消息 6 、自定义回调函数 一、View结构原理 Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类。 View定义了绘图的基本操作 基本操作由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。具体操作如下: 1、measure操作 measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数: (1)onMeasure(),视图大小的将在这里最终确定,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。 2、layout操作 layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作: (1)setFrame(l,t