以dot net core为Azure Blob Storage提供图像

时间:2017-01-02 04:16:04

标签: asp.net-core asp.net-core-mvc asp.net-core-middleware

我正在尝试编写一些中间件来通过代理服务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" />

当我调试时,我可以看到所有正确的部分被击中,但图像从未加载,我只是得到以下内容:

broken image

我觉得我错过了一些简单的东西,但我不确定那是什么。我使用的是NetCoreApp版本1.1。

1 个答案:

答案 0 :(得分:7)

我想我早点跳了一下枪,因为它看起来你可以写到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);
    }
}