dotnet 用 ASP.NET Core 制作一个可以上传库文件的 NuGet 服务器

2020-04-08 15:49:06 浏览数 (1)

我在写一个有趣的 WPF 应用,我想要测试这个 WPF 应用的一个功能,这个功能就是一键点击自动推送 NuGet 包到服务器。我想要做一点自动化的测试,我需要有某个假装是 NuGet 的服务器用来接收我这个应用推送的 NuGet 包。用 ASP.NET Core 写一个假装的 NuGet 服务器,支持被 NuGet 推送包是特别简单的,本文就来和大家说说这个后台如何写

其实有现成的整个 NuGet 服务器,包含了包的列举和上传等功能,这就是 BaGet 项目,但是这个项目存在的问题是太大了,我想要做到自动测试里面去,又有很多有趣的逻辑需要写

那么自己从零开始写一个 NuGet 服务器,这个服务器只有一个功能就是接收 NuGet 推送的包,这个工作量大不大?在使用 ASP.NET Core 时只能说工作量特别小

下面让我用 3 分钟告诉大家如何在 asp dotnet core 里面写一个支持被推送 nuget 包的服务器

首先是创建一个空白的工程,此时这个功能请去掉 https 的逻辑,注意去掉 Startup.cs 的重定向逻辑。先跑通过了 http 之后小伙伴自己再去配置 https 哦

根据 官方文档 说的,默认的 NuGet 的上传文件就是通过发送一个 multipart form data 数据,发送到制定的源里面,例如我准备推送 ant-design-blazor.nupkg 库的时候,通过下面代码

代码语言:javascript复制
nuget push -Source http://localhost:49614/api/v2/package AntBlazor.0.0.1.nupkg -ApiKey 123

将会向服务器 http://localhost:49614/api/v2/package 发送一个 multipart form data 数据,这个数据里面只包含了一个文件信息

在 asp dotnet core 可以通过下面代码接收 form 表单信息

代码语言:javascript复制
        [HttpPut]
        public async Task<IActionResult> Push([FromForm]FilePackage package)
        {

        }

注意加上 FromForm 特性,如果没有加上特性那么将会返回客户端 415 Unsupported Media Type 信息

这里的 FilePackage 的定义如下

代码语言:javascript复制
    public class FilePackage
    {
        public IFormFile Package { set; get; }
    }

此时从参数里面拿到的 package 属性就是客户端上传的对应的 NuGet 库

修改一下控制器的路径,这样才好假装这是一个 NuGet 服务器

代码语言:javascript复制
    [ApiController]
    [Route("api/v2/[controller]")]
    public class PackageController : ControllerBase
    {
        [HttpPut]
        public async Task<IActionResult> Push([FromForm]FilePackage package)
        {
        	// 代码
        }
    }

这样就完成了制作一个假装的 NuGet 上传服务器了

其实如果不从参数里面获取客户端上传的 NuGet 库,还可以通过 HttpContext.Request.Form 拿到,请看代码

代码语言:javascript复制
            var packageFile = package.Package;
            if (packageFile == null)
            {
                packageFile = HttpContext.Request.Form.Files.FirstOrDefault();
            }

而将 IFormFile 保存到本地也很简单,请看代码

代码语言:javascript复制
            var file = Path.GetTempFileName();
            using (var stream = new FileStream(file, FileMode.OpenOrCreate))
            {
                await packageFile.CopyToAsync(stream);
            }

大概用不到3分钟就能完成一个假装的 NuGet 服务器

细心的小伙伴还发现了刚才的命令行有添加 ApiKey 信息,这个信息可以偷偷在 HttpContext.Request.Headers 拿到

代码语言:javascript复制
             var key = HttpContext.Request.Headers["X-NuGet-ApiKey"];

本文代码放在 github 欢迎小伙伴访问

顺便广告一下 ant-design-blazor 这个使用 Blazor 的 ant 界面库,欢迎小伙伴关注

0 人点赞