背景

验证码这个功能是十分常见的,各大系统的登录页面都会有。今天介绍一下最为普通的验证码。

无论最终给到前端的是图片格式的验证码还是base64格式的验证码,其实都离不开这样的一步操作,都要先在后台生成一个图片。

就个人经验来说,早期的.NET Core想在Linux/Docker下面搞图片这些还是相对麻烦一些的,首先是组件这一块,其次是依赖这一块。

不过,现在方便多了。

下面就基于ImageSharp这个组件来实践一下。

准备工作

  1. 安装相应的nuget包

<ItemGroup><PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-beta0007" /><PackageReference Include="SixLabors.Fonts" Version="1.0.0-beta0009" /><PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta0007" />
</ItemGroup>

需要注意的是,ImageSharp目前还不是正式版。

  1. 准备一下字体文件

示例用的是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());
}

都是中规中矩的代码,这里需要注意下面几个地方:

  1. 关于字体,这里取的是当前系统的第一个,如果系统一个字体都没有,那肯定是抛异常的。正常的.net core的docker镜像是没有的,所以这也是为什么我们在前面要准备字体的原因。

  2. Fill、DrawText、DrawLines这三个画图的方法大家看看说明就可以了

  3. 对于生成格式,老黄这里用的是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下面生成简易验证码相关推荐

  1. ASP.NET Core amp; Docker 实战经验分享

    一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...

  2. 深入浅出 ASP.NET Core 与 Docker 入门课程说明

    点击蓝字"角落的白板报"关注我哟 加个"星标★",好文必达! 深入浅出 ASP.NET Core 与 Docker 入门课程说明 <深入浅出 ASP.NE ...

  3. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

  4. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  5. 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档

    Swagger是一个描述RESTful的Web API的规范和框架.如果使用ASP.NET的话,可以用Swashbuckle来自动生成Swagger,具体参考如何使 WebAPI 自动生成漂亮又实用在 ...

  6. netcore docker_深入浅出 ASP.NET Core 与 Docker 入门课程目标说明

    课程目标说明https://www.zhihu.com/video/1241137370310508544 <深入浅出 http://ASP.NET Core 与 Docker >是一门新 ...

  7. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

  8. ASP.NET Core开发Docker部署

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  9. 使用ASP.NET Core 实现Docker的HealthCheck指令

     写在前面 HealthCheck 不仅是对应用程序内运行情况.数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查. 健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配 ...

最新文章

  1. 大数据中心周边辐射大吗_PETCT有辐射,PETCT对陪同人员的影响大吗?
  2. JAVA --BYTECODE
  3. php应用编程,极客编程必备的五大PHP开发应用_PHP
  4. c#winform演练 ktv项目 MediaPlay控件的暂停播放与停止
  5. 罗永浩:6亿债务,已还了4个亿;Python 3.9指日可待|极客头条
  6. php order不管用,php – WooCommerce – get_order()不起作用,它返回零
  7. python爬虫简历项目怎么写_爬虫项目咋写,爬取什么样的数据可以作为项目写在简历上?...
  8. RGB(三色)灯配置常用颜色数据,用法讲解,基于C语言的程序讲解,七彩渐变程序讲解
  9. 揭秘微信对方正在输入……到底表示什么意思?
  10. Hantek6022BE 虚拟示波器 使用心得
  11. 安装VisualSVN server
  12. git 上传出现“ ! [rejected] master -> master (non-fast-forward)”
  13. 去掉数组中是数字的引号
  14. java dofinal_Java Mac.doFinal方法代碼示例
  15. 读《庄子》(1) [收藏]
  16. 排列组合思维导图_思维导图:进阶高效能人士的思维工具
  17. 如何引流,如何维护社群?
  18. 百度指数、360指数爬虫python版:基于selenium+chrome和图像识别技术
  19. 【笔记】linux上的音频转换mp4-mp3
  20. Android布局帧布局霓虹灯效果实现

热门文章

  1. Mustache.js使用笔记(内容属于转载总结)
  2. jenkins2 groovy语法
  3. BDB (Berkeley DB)简要数据库(转载)
  4. Redis系统性介绍
  5. Fiddler进行模拟Post提交json数据,总为null解决方式
  6. 如何在不支付Adobe Photoshop费用的情况下处理Camera Raw
  7. 「读懂源码系列2」我从 lodash 源码中学到的几个知识点
  8. JavaFX 学习笔记——窗口与控件
  9. “数据门”事件频发 如何避免人为因素导致数据泄露?
  10. 图片压缩上传Thumbnailator 插件