在 dot net core 中提供来自 Azure Blob Storage 的图像

Serving images from Azure Blob Storage in dot net core

我正在尝试编写一些中间件以通过代理为 Azure Blob 提供服务。正在调用处理程序,正在检索 blob,但未显示我的图像。

我编写了一个服务来连接到存储帐户并创建一个 Blob 客户端。我编写了使用该服务的中间件,然后下载请求的 blob 并将其写入 Response。通常,我希望将 blob 下载为字节数组或流并将其写入 OutputStream,这似乎不是使用 .net 核心中的新 httpContext 的选项。

我的中间件:

namespace SampleApp1.WebApp.Middleware
{
    public class BlobFileViewHandler
    {
        public BlobFileViewHandler(RequestDelegate next)
        {
        }

        public async Task Invoke(HttpContext httpContext, IBlobService svc)
        {
            string container = httpContext.Request.Query["container"];
            string itemPath = httpContext.Request.Query["path"];

            Blob cbb = await svc.GetBlobAsync(container, itemPath);

            httpContext.Response.ContentType = cbb.ContentType;
            await httpContext.Response.Body.WriteAsync(cbb.Contents, 0, cbb.Contents.Length);            
        }
    }

    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class BlobFileViewHandlerExtensions
    {
        public static IApplicationBuilder UseBlobFileViewHandler(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<BlobFileViewHandler>();
        }
    }
}

我在 Startup 中使用 Map 函数调用中间件,如下所示:

app.Map(new PathString("/thumbs"), a => a.UseBlobFileHandler());

最后,我尝试在测试页面上使用该处理程序,如下所示:

<img src="~/thumbs?qs=1" alt="thumbtest" />

当我调试时,我可以看到所有正确的部分都被命中,但图像从未加载,我只得到以下信息:

我觉得我缺少一些简单的东西,但我不确定那是什么。我正在使用 NetCoreApp 版本 1.1。

我想我有点早了,因为看起来您可以写入 OutputStream,只是引用方式稍有不同。下面是我在中间件中尝试的工作实现:

public class BlobFileHandler
{
    public BlobFileHandler(RequestDelegate next)
    {
    }

    public async Task Invoke(HttpContext httpContext)
    {
        string container = "<static container reference>";
        string itemPath = "<static blob reference>";
        //string response;
        IBlobService svc = (IBlobService)httpContext.RequestServices.GetService(typeof(IBlobService));

        CloudBlockBlob cbb = svc.GetBlob(container, itemPath);

        httpContext.Response.ContentType = "image/jpeg";//cbb.Properties.ContentType;            
        await cbb.DownloadToStreamAsync(httpContext.Response.Body);
    }
}