NetCore组件
NetCore之组件写法
本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等; 这里我也通过调用验证码接口来自定义个组件以此说明如何使用,以及使用时需要注意的场景;
Middleware之hello world
对于netcore来说,通常会在UseStartup<Startup>对应的Startup类中引用组件,这个Startup可以换成自己自定义的其实类,不过需要在UseStartup的时候指向她;这里还是以Startup类为例,通过vs自动生成的文件,在这个类中我们能看到Configure方法体里面包含了:app.UseMvc(),app.UseStaticFiles(),app.xxx()等一些列自带的组件,下面来看下自定义个hello world中组件实例,首先使用静态扩展方法扩展IApplicationBuilder:

1 public static class MiddlewareExtends
2 {
3 /// <summary>
4 /// 测试用例中间件
5 /// </summary>
6 /// <param name="builder"></param>
7 /// <returns></returns>
8 public static IApplicationBuilder UseTest(this IApplicationBuilder builder)
9 {
10 return builder.UseMiddleware<TestMiddleware>();
11 }
12
13 }

使用 builder.UseMiddleware<TestMiddleware>() 来添加自定义组件,组件实现代码如下:

1 public class TestMiddleware
2 {
3 private RequestDelegate _requestDelegate;
4 public TestMiddleware(RequestDelegate requestDelegate)
5 {
6 _requestDelegate = requestDelegate;
7 }
8
9 public Task Invoke(HttpContext context)
10 {
11
12 context.Items["TestMiddleware"] = "hello world,我是TestMiddleware。";
13
14 return _requestDelegate(context);
15 }
16 }

以上是最基础的组件格式;注:
1. 组件必须要有 public Task Invoke(HttpContext context) ,HttpContext是咋们http上下文,Invoke()委托方法,每次程序被访问时就会进入Invoke;
2. 要有 public delegate Task RequestDelegate(HttpContext context); 委托方法,来响应http请求;
到这里咋们hello world就完成了,为了测试方法,我们直接在action中写入如下代码:

1 public IActionResult About()
2 {
3
4 ViewData["Message"] = HttpContext.Items["TestMiddleware"];
5 return View();
6 }

运行结果:

组件异步写法

1 public class TestMiddleware
2 {
3 private RequestDelegate _requestDelegate;
4 public TestMiddleware(RequestDelegate requestDelegate)
5 {
6 _requestDelegate = requestDelegate;
7 }
8
9 public async Task Invoke(HttpContext context)
10 {
11
12 context.Items["TestMiddleware"] = "hello world,我是asyncTestMiddleware。";
13
14 await _requestDelegate(context);
15 }
16 }

仅仅需要async 和 await 组合修饰就行了;
.netcore自定义验证码组件

1 /// <summary>
2 /// 文字验证码
3 /// </summary>
4 public class WenZiCodeMiddleware
5 {
6 private RequestDelegate _requestDelegate;
7 public WenZiCodeMiddleware(RequestDelegate requestDelegate)
8 {
9 _requestDelegate = requestDelegate;
10 }
11
12 public async Task Invoke(HttpContext context)
13 {
14
15 var url = "http://localhost:1001/shenniuapi/WenZiValidateCode";
16 using (HttpClient client = new HttpClient())
17 {
18 client.Timeout = TimeSpan.FromSeconds(60);
19
20 var str = "{\"UserName\": \"神牛步行3\",\"UserPwd\": \"4297f44b13955235245b2497399d7a93\",\"Token\": \"008我是测试\"}";
21 var content = new StringContent(str, Encoding.UTF8, "application/x-www-form-urlencoded");
22 content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
23 var result01 = client.PostAsync(url, content).Result;
24 var stream = await result01.Content.ReadAsStreamAsync();
25 using (var reader = new StreamReader(stream))
26 {
27 var result02 = await reader.ReadToEndAsync();
28 context.Items["codedata"] = result02;
29 }
30 }
31
32 await _requestDelegate(context);
33 }
34 }

我们同样需要再静态扩展方法里面添加如下代码,来加入组件:

1 /// <summary>
2 /// 文字验证码中间件
3 /// </summary>
4 /// <param name="builder"></param>
5 /// <returns></returns>
6 public static IApplicationBuilder UseWenZiValidateCode(this IApplicationBuilder builder)
7 {
8 return builder.UseMiddleware<WenZiCodeMiddleware>();
9 }

在Configure方法中,引用组件: app.UseWenZiValidateCode(); ;Action中,使用组件:

1 public FileResult GetCode()
2 {
3 var data = HttpContext.Items["codedata"].ToString();
4 var code = JsonConvert.DeserializeObject<MoValidateCodeResponse>(data);
5 return File(code.CodeStream, "image/jpeg");
6 }

View试图中代码:
1 GetCode:<img src="/home/GetCode" data-src="/home/GetCode" />
效果展示:

这里需要考虑场景是,我们上面提及到的Invoke方法是任意请求都会进入,那验证码这种功能做成组件是否不是很合理,因为验证码也只有在登陆界面或验证的界面需要用到而已,如我们上面写的验证码组件,每次都会被程序执行这显然不合理,因此个人认为如果你需要自定义组件,那么需要考量:是否每次请求都需要进入您的组件服务,如果不需要的话,那其实没必要弄一个组件,当然感觉很高大上;因此这里我不得不使用静态扩展方法(当然还有其他方式)来重写获取验证码的方法;
静态扩展方法重写验证码组件
由于上面我们在添加组件时有一个静态类了,那么我们直接在上面补充扩展方法:

1 /// <summary>
2 /// 文字验证码
3 /// </summary>
4 /// <param name="context"></param>
5 /// <returns></returns>
6 public static async Task<MoValidateCodeResponse> WenZiCode(this HttpContext context)
7 {
8 var code = default(MoValidateCodeResponse);
9 try
10 {
11 var url = "http://localhost:1001/shenniuapi/WenZiValidateCode";
12 using (HttpClient client = new HttpClient())
13 {
14 client.Timeout = TimeSpan.FromSeconds(60);
15
16 var str = "{\"UserName\": \"神牛步行3\",\"UserPwd\": \"4297f44b13955235245b2497399d7a93\",\"Token\": \"008我是测试\"}";
17 var content = new StringContent(str, Encoding.UTF8, "application/x-www-form-urlencoded");
18 content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
19 var result01 = client.PostAsync(url, content).Result;
20 var stream = await result01.Content.ReadAsStreamAsync();
21 using (var reader = new StreamReader(stream))
22 {
23 var result02 = await reader.ReadToEndAsync();
24 code = await JsonConvert.DeserializeObjectAsync<MoValidateCodeResponse>(result02);
25 }
26 }
27 }
28 catch (Exception ex)
29 {
30 }
31 return code;
32 }

对应的验证码实体类:
这个时候同样来到Action中:

1 public async Task<FileResult> GetCodeAsync()
2 {
3 var code = await HttpContext.WenZiCode();
4
5 return File(code.CodeStream, "image/jpeg");
6 }

修改view试图代码,增加点击验证码图片重新获取新的验证码:

1 <style type="text/css">
2 img{cursor:pointer}
3 </style>
4 <h3>@ViewData["Message"]</h3>
5 <h3>@ViewData["codedata"]</h3>
6 GetCode:<img src="/home/GetCode" data-src="/home/GetCode" />
7 GetCodeAsync:<img src="/home/GetCodeAsync" data-src="/home/GetCodeAsync" />
8
9 <script src="~/lib/jquery/dist/jquery.js"></script>
10 <script>
11 $(function () {
12 $("img").on("click", function () {
13 var img = this;
14 var nowTime = new Date().getTime();
15 var src = $(img).attr("data-src") + "?t=" + nowTime;
16 $(img).attr("src", src);
17 });
18 })
19 </script>

效果图:

NetCore组件的更多相关文章
- Asp.NetCore之组件写法
本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...
- .net core2.0+nginx+Ubuntu14.04【一个小白的初次尝试】
新的业务来了,需要使用linux环境部署web服务,作为一个C#的懒惰程序员,就这么上了车[狗脸],废话不多说,跟我一样的小白请看,大神请绕路. 站点暂时没有使用Docker部署,为什么呢,因为我还没 ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- netcore实践:跨平台动态加载native组件
缘起netcore框架下实现基于zmq的应用. 在.net framework时代,我们进行zmq开发由很多的选择,比较常用的有clrzmq4和NetMQ. 其中clrzmq是基于libzmq的Int ...
- .Netcore之日志组件Log4net、Nlog性能比较
转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (六)实现业务功能
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (四)授权过滤
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
随机推荐
- hihocoder1075【开锁魔法】
hihocoder1075[开锁魔法] 题意是给你一个 \(1-n\) 的置换,求选 \(k\) 个可以遍历所有点的概率. 题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求 ...
- listen 74
Genes Link Touch and Hearing Sound and touch may seem completely separate, except possibly when play ...
- str_2.判断两个字符串是否互为旋转词
1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...
- static修饰类的作用
Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...
- MySQL_杭州拱墅区、西湖区近9-11月销售过的产品_20161125
需求:杭州拱墅区.西湖区近9-11月销售过的产品 这个SQL如果对数据表熟悉的话可以一步到位,为了看的更清楚,时间间隔在3个月产品数量也不是很多,采取先找明细再进行汇总. 一.第一种写法 分步骤的写S ...
- drop asm disk、撤销drop asm disk
drop asm disk.撤销drop asm disk drop asm disk:SQL> alter diskgroup XXX offline disk XXXX drop after ...
- TTY,Console以及Terminal
TTY可以理解是一种终端显示.可以在/dev文件夹看到多个tty开头的文件,可以通过alt+Fn(n=1~6)来进行切换.这个是不是和GUI场景下的多个Terminal窗口是一致的呢? 伪TTY是指一 ...
- 杂项-QRCode:ZXing
ylbtech-杂项-QRCode:ZXing 1.返回顶部 1. ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用 ...
- day1 java基础回顾-多线程
启动线程方式 方式一:继承Thread. 1. 自定义一个类继承Thread类. 2. 重写Thread的run方法,把自定义线程的任务代码定义在run方法上. 3. 创建Thread子类的对象,并且 ...
- QDUOJ 炸老师与他的女朋友们 bfs+状压
炸老师与他的女朋友们 Description qdu最帅的炸老师今天又要抽空去找他的女朋友们了,但是考虑到他的好gay友ycb仍是个单身狗,炸老师作为基友不希望打击他.所以他在找女朋友们的路途中必须要 ...