.NetCore 在 Docker 中跑起二维码

        因为要做一个APP扫码登录PC站点的功能,找了几个 .NetCore 中生成二维码的方案。
        几年前在 .NetFramework 下做过生成二维码的功能,用的 ThoughtWorks.QRCode ,不过它不支持 .NetCore。而且我要跑在 Docker 里,所以光支持 .NetCore 不行,还要支持 linux。搜 ThoughtWorks.QRCode 的时候,看到有人做了 Core 版的移植了。但是看它引用了 System.Drawing.Common 就觉得有点悬。然后试了下,做了个示例的 Mvc 站点,直接F5启动没问题,放Docker 里不出图片。
        然后继续找其他的方案。搜到一篇文章推荐的 SkiaSharp 和 ZXing.Net,按照说明做示例站点,本地跑起没问题,放Docker里还报错,根据提示进Docker 装了几个 dll ,重启发现没有用。

        然后换个思路,觉得使用了 System.Drawing 的应该都不行,.NetCore下的图形库应该用 ZKWeb.System.Drawing,然后百度了下“ZKWeb.System.Drawing 二维码”,果然发现有人用它解决了二维码的问题。
        下面是示例项目开发过程:
1,建立 Web Mvc 应用程序项目,我建立的 Net Core 3.0的项目,2.2  2.1的应该一样。
2,Nuget 包管理器里边引用 ZXing.Net.Bindings.ZKWeb.System.Drawing。
3,建立 CodeHelper 类,名称不重要,输入以下代码。

public static byte[] QrCode(string message, int width = 200, int height = 200)
{
    var w = new ZXing.QrCode.QRCodeWriter();

    BitMatrix b = w.encode(message, BarcodeFormat.QR_CODE, width, height, new Dictionaryobject>() {
        { EncodeHintType.MARGIN, 1 },
        { EncodeHintType.QR_VERSION, 6 },
        { EncodeHintType.WIDTH, 200 },
        { EncodeHintType.HEIGHT, 200 }
    });
    var zzb = new ZXing.ZKWeb.BarcodeWriter();
    zzb.Options = new EncodingOptions()
    {
        Margin = 0,
    };
    Bitmap b2 = zzb.Write(b);
    using MemoryStream ms = new MemoryStream();
    b2.Save(ms, ImageFormat.Png);
    return ms.ToArray();
}

4,把Home控制器的Index方法,改成以下代码:

public IActionResult Index()
{
    var bs = CodeHelper.QrCode("这里是要生成的二维码内容");
    return File(bs, "image/png");
}

5,在项目根目录建立 Dockerfile 文件,并把属性改为“如果较新则复制”或“始终复制”,并输入以下内容。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
RUN apt-get update
RUN apt-get install libgdiplus -y && ln -s libgdiplus.so gdiplus.dll
WORKDIR /app
COPY . ./
ENV TZ=Asia/Shanghai
ENTRYPOINT ["dotnet", "TestOfQrCodeInDocker.dll"]

其中 ENV TZ=Asia/Shanghai 可省略,是指定时区的,这个项目里没有用,TestOfQrCodeInDocker 是我的项目名,改成你的项目名。
6,发布项目,打包成 ZIP 文件,传到 Docker 服务器上,做镜像,跑起。
        不出意外,项目首页就是一张二维码的图片了。

你可能感兴趣的:(.NetCore 在 Docker 中跑起二维码)