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组件的更多相关文章

  1. Asp.NetCore之组件写法

    本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...

  2. .net core2.0+nginx+Ubuntu14.04【一个小白的初次尝试】

    新的业务来了,需要使用linux环境部署web服务,作为一个C#的懒惰程序员,就这么上了车[狗脸],废话不多说,跟我一样的小白请看,大神请绕路. 站点暂时没有使用Docker部署,为什么呢,因为我还没 ...

  3. 跨语言调用Hangfire定时作业服务

    跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...

  4. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  5. netcore实践:跨平台动态加载native组件

    缘起netcore框架下实现基于zmq的应用. 在.net framework时代,我们进行zmq开发由很多的选择,比较常用的有clrzmq4和NetMQ. 其中clrzmq是基于libzmq的Int ...

  6. .Netcore之日志组件Log4net、Nlog性能比较

    转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...

  7. .NetCore 下开发独立的(RPL)含有界面的组件包 (六)实现业务功能

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  8. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  9. .NetCore 下开发独立的(RPL)含有界面的组件包 (四)授权过滤

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

随机推荐

  1. linux命令学习笔记(52):ifconfig命令

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有 一个类似的工具,也就是ifconfig (interfaces config).通 ...

  2. android自定义控件(六) 刷新

    三种得到LinearInflater的方法 a. LayoutInflater inflater = getLayoutInflater(); b. LayoutInflater localinfla ...

  3. ntp服务器同步时间详细配置

    部署NTP服务器进行时间同步   NTP服务端:linl_S    IP:10.0.0.15 NTP客户端:lin_C    IP:10.0.0.16 NTP服务概述 1.原理 NTP(Network ...

  4. 【Lintcode】137.Clone Graph

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  5. 用PCA降维 (Principal Component Analysis,主成分分析)

    参考资料:Mastering Machine Learning With scikit-learn 降维致力于解决三类问题.第一,降维可以缓解维度灾难问题.第二,降维可以在压缩数据的同时让信息损失最 ...

  6. Poj_1005_I Think I Need A HouseBoat

    一.Description Fred Mapper is considering purchasing some land in Louisiana to build his house on. In ...

  7. gitea (git服务器), 修改配置,更换IP地址

    使用的gitea项目管理git 服务器 (可以不用备份项目, 通过直接修改gitea配置, 直接使用) 步骤1 可以直接访问项目, 步骤2 ,如果已有项目IP地址固定为192.168.1.x, 新的I ...

  8. Http协议-概要

    Http协议(超文本传输协议)是位于TCP/IP结构中的应用层的一种传输协议,规定了万维网服务器之间相互通信的规则.比如比较常见的Web浏览器客户端与应用服务器的通信!万维网服务器之间互相通信的时候往 ...

  9. MySQL 之 扩展例子

    扩展例子 插入一条记录 INSERT INTO 表名 [(字段1,…,字段n)] VALUES (值1,…,值n) 插入查询的结果 INSERT INTO 表名 (字段1,…,字段n) VALUES ...

  10. uva 12452 Plants vs. Zombies HD SP (树DP)

    Problem I: Plants vs. Zombies HD Super Pro Plants versus Zombies HD Super Pro is a game played not a ...