ASP.NET Core在Docker下面生成简易验证码
背景
驗證碼這個功能是十分常見的,各大系統的登錄頁面都會有。今天介紹一下最為普通的驗證碼。
無論最終給到前端的是圖片格式的驗證碼還是base64格式的驗證碼,其實都離不開這樣的一步操作,都要先在后臺生成一個圖片。
就個人經驗來說,早期的.NET Core想在Linux/Docker下面搞圖片這些還是相對麻煩一些的,首先是組件這一塊,其次是依賴這一塊。
不過,現在方便多了。
下面就基于ImageSharp這個組件來實踐一下。
準備工作
安裝相應的nuget包
需要注意的是,ImageSharp目前還不是正式版。
準備一下字體文件
示例用的是comic.ttf,這個只有240kb,算是比較小的了。
這里選一個小一點的字體是因為不想讓打包好的鏡像太大,如果各位大佬有更小體積的字體可以告訴我一下哈。
編碼實現
首先是生成隨機數,應該不用說太多,如果先生成完成不一樣的數字或字母,自由控制就好。
private?static?string?GenCode(int?num) {var?code?=?string.Empty;var?r?=?new?Random();for?(int?i?=?0;?i?<?num;?i++){code?+=?Chars[r.Next(Chars.Length)].ToString();}return?code; }然后就是生成的核心代碼了。
private?static?readonly?Color[]?Colors?=?{?Color.Black,?Color.Red,?...?}; private?static?readonly?char[]?Chars?=?{?'0',?....?}; private?static?readonly?int?Width?=?90; private?static?readonly?int?Height?=?35;public?static?(string?code,?byte[]?bytes)?GenVCode(int?num) {var?code?=?GenCode(num);var?r?=?new?Random();using?var?image?=?new?Image<Rgba32>(Width,?Height);//?字體var?font?=?SystemFonts.CreateFont(SystemFonts.Families.First().Name,?25,?FontStyle.Bold);image.Mutate(ctx?=>{//?白底背景ctx.Fill(Color.White);//?畫驗證碼for?(int?i?=?0;?i?<?code.Length;?i++){ctx.DrawText(code[i].ToString(),?font,?Colors[r.Next(Colors.Length)],?new?PointF(20?*?i?+?10,?r.Next(2,?12)));}//?畫干擾線for?(int?i?=?0;?i?<?10;?i++){var?pen?=?new?Pen(Colors[r.Next(Colors.Length)],?1);var?p1?=?new?PointF(r.Next(Width),?r.Next(Height));var?p2?=?new?PointF(r.Next(Width),?r.Next(Height));ctx.DrawLines(pen,?p1,?p2);}//?畫噪點for?(int?i?=?0;?i?<?80;?i++){var?pen?=?new?Pen(Colors[r.Next(Colors.Length)],?1);var?p1?=?new?PointF(r.Next(Width),?r.Next(Height));var?p2?=?new?PointF(p1.X?+?1f,?p1.Y?+?1f);ctx.DrawLines(pen,?p1,?p2);}});using?var?ms?=?new?System.IO.MemoryStream();//?gif?格式image.SaveAsGif(ms);return?(code,?ms.ToArray()); }都是中規中矩的代碼,這里需要注意下面幾個地方:
關于字體,這里取的是當前系統的第一個,如果系統一個字體都沒有,那肯定是拋異常的。正常的.net core的docker鏡像是沒有的,所以這也是為什么我們在前面要準備字體的原因。
Fill、DrawText、DrawLines這三個畫圖的方法大家看看說明就可以了
對于生成格式,老黃這里用的是Gif,它支持Bmp,Gif,Jpeg,Png還有Base64,大家可以按需選擇,這里建議用Gif或Jpeg,因為生成的圖片會比較小,2.5kb左右。
最后就是調用了。
[HttpGet] public?IActionResult?GetCode() {var?(code,?bytes)?=?VCodeHelper.GenVCode(4);//?code?handle?logicSystem.Console.WriteLine(code);return?File(bytes,?"image/gif"); }Dockerfile
簡單修改一下Dockerfile,加一句復制字體的命令。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80# 復制字體到 /usr/share/fonts 目錄 COPY ./comic.ttf /usr/share/fonts/comic.ttfFROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY . . RUN dotnet restore "VCodeTest.sln" WORKDIR /src/VCodeTest RUN dotnet build "VCodeTest.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "VCodeTest.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "VCodeTest.dll"]效果
生成鏡像,運行效果如下:
文中的示例代碼可以在我的github找到:
https://github.com/catcherwong-archive/2020/tree/master/05/VCodeTest
小結
ImageSharp 這個組件用起來還是挺舒服的,大家可以嘗試嘗試。
總結
以上是生活随笔為你收集整理的ASP.NET Core在Docker下面生成简易验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不要把异常当做业务逻辑,这性能可能你无法
- 下一篇: asp.net ajax控件工具集 Au