Asp.NetCore之組件寫法

来源:http://www.cnblogs.com/wangrudong003/archive/2017/04/05/6670191.html
-Advertisement-
Play Games

本章內容和大家分享的是Asp.NetCore組件寫法,在netcore中很多東西都以提供組件的方式來使用,比如MVC架構,Session,Cache,資料庫引用等; 這裡我也通過調用驗證碼介面來自定義個組件以此說明如何使用,以及使用時需要註意的場景; Middleware之hello world 對 ...


本章內容和大家分享的是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         }

對應的驗證碼實體類:

 1  /// <summary>
 2     /// 神牛介面返回基類
 3     /// </summary>
 4     public class MoShenNiuBaseResponse
 5     {
 6         /// <summary>
 7         /// 返回狀態: 0:失敗 1:成功
 8         /// </summary>
 9         public int Status { get; set; }
10 
11         /// <summary>
12         /// 錯誤信息
13         /// </summary>
14         public string Msg { get; set; }
15     }
16 
17     /// <summary>
18     /// 驗證碼返回類
19     /// </summary>
20     public class MoValidateCodeResponse : MoShenNiuBaseResponse
21     {
22 
23         public MoValidateCodeResponse()
24         {
25             this.ImgCode = new List<MoImgCode>();
26         }
27 
28         /// <summary>
29         /// 驗證碼類型
30         /// </summary>
31         public string Code { get; set; }
32 
33         /// <summary>
34         /// 驗證碼圖片流
35         /// </summary>
36         public byte[] CodeStream { get; set; }
37 
38         /// <summary>
39         /// 圖片驗證坐標
40         /// </summary>
41         public List<MoImgCode> ImgCode;
42     }
43 
44     /// <summary>
45     /// 圖片驗證碼坐標
46     /// </summary>
47     public class MoImgCode
48     {
49         public string Index { get; set; }
50 
51         public string IndexType { get; set; }
52 
53         public string ImgUrl { get; set; }
54 
55         public Point Point_A { get; set; }
56 
57         public Point Point_B { get; set; }
58 
59         public bool IsChoice { get; set; }
60     }
61 
62     public class Point
63     {
64         public int X { get; set; }
65         public int Y { get; set; }
66     }
View Code

這個時候同樣來到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>

效果圖:

以上就是本篇的所有內容,旨在分享怎麼寫一個組件和什麼時候用組件合適,謝謝大家支持和點贊。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內部類,就是在類的內部定義的類......內部類訪問特點1,內部類可以直接訪問外部類的成員,包括私有...2,外部類要訪問內部類的成員,必須創建對象...外部類名.內部類名 對象名=外部類對象.內部類對象; class Test { public static void main(String[] ...
  • 一、Jenins+GitHub "參考" 另外需要配置Global Tool Configuration 如果沒有安裝git,需下載安裝, "下載地址" 二、jenkins發佈donet core應用 1.配置MSBuild 1.1安裝Visual Studio 2017生成工具, "下載地址" 1 ...
  • 使用 StackExchange.Redis 封裝屬於自己的 RedisHelper 目錄 核心類 ConnectionMultiplexer 字元串(String) 哈希(Hash) 列表(List) 有序集合(sorted set) Key 操作 發佈訂閱 其他 簡介 目前 .NET 使用訪問 ...
  • 下拉列表 以性別為例 綁定可以了,可以顯示了,但有些地方就能傳值,有些地方就會出錯提示,如有大神請指教。。。。 錯誤如下: 具有鍵“sex”的 ViewData 項屬於類型“YTgoShopping.Utilities.sex”,但它必須屬於類型“IEnumerable<SelectListItem ...
  • 一、屌絲也有春天 "親愛的,在不?" "妹子,你電腦又感覺慢了麽?您以後裝軟體的時候註意點行不,能不能不要裝上7-8個瀏覽器,3-4個殺毒軟體,啥配置的機子你都感覺卡。以後別到處瞎找動作類電影看,網上一般都掛馬騙你們這些小白的,實在想看找我要種子不就行了。" "沒有啦,人家電腦好著呢,您不是做軟體的 ...
  • 如果大家研究一些開源項目,會發現無處不在的DI(Dependency Injection依賴註入)。 本篇文章將會詳細講述如何在MVC中使用Ninject實現DI 文章提綱 場景描述 & 問題引出 第一輪重構 引入Ninject 第二輪重構 總結 場景描述 & 問題引出 DI是一種實現組件解耦的設計 ...
  • 度娘許久,找不到我滿意的答案,於是自己東湊西湊實現一個。 DynamicObject擴展--實現JSON和DynamicObject的序列化與反序列化,親測良好。 看代碼 ...
  • 跨平臺系列彙總:http://www.cnblogs.com/dunitian/p/4822808.html#linux 上次說了安裝VSCode(http://www.cnblogs.com/dunitian/p/6661644.html)和sogou(http://www.cnblogs.com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...