2

Я пытаюсь написать некоторое промежуточное программное обеспечение для обслуживания Azure Blobs через прокси. Вызывается обработчик, извлекается blob, но мое изображение не отображается.Обслуживание изображений из хранилища Azure Blob в ядре с точечной сетью

Я написал службу для подключения к учетной записи хранения и создания клиента Blob. Я написал промежуточное программное обеспечение, которое расходует службу, а затем загружает запрошенный блок и записывает его в ответ. Обычно я ожидал бы загрузить blob в виде байтового массива или потока и записать его в OutputStream, и это не похоже на использование нового httpContext в ядре .net.

Мои Middleware:

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>(); 
     } 
    } 
} 

Я называю промежуточное с помощью функции карты в запуске, как показано ниже:

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

И, наконец, я пытаюсь использовать этот обработчик на тестовой странице следующим образом:

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

Когда я отладки I C ГЭЭ все правильные детали удара, но изображение не загружает, я получаю следующее:

broken image

Я чувствую, что я что-то просто не хватает, но я не уверен, что это такое. Я использую NetCoreApp версии 1.1.

+0

Я попробовал ваше решение, beceuse это то, что мне нужно, но есть проблемы с помощью следующей строки app.Map (новый PathString ("/ большие пальцы "), a => a.UseBlobFileHandler()); можно u сделать больше информация pls. thnx – Wasyster

+0

app.Map() просто замыкает конвейер и позволяет среде выполнения знать, что любой запрос к данному пути должен обрабатываться указанным промежуточным программным обеспечением. Так моделируются HttpHandlers в ядре .net. – randcd

+0

Я это понимаю, но он показывает мне ошибку для a => a.UseBlobFileHandler() – Wasyster

ответ

5

Я предполагаю, что я подпрыгнул пистолет немного раньше, потому что, похоже, вы МОЖЕТЕ писать в 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); 
    } 
} 
Смежные вопросы