Как вернуть большой двоичный объект из функции Azure, запускаемой по протоколу HTTP? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь использовать функцию Azure для возврата файла из хранилища BLOB-объектов. Как есть, у меня это работает, но работает неэффективно, считывая весь большой двоичный объект в память, а затем записывая его обратно. Это работает для маленьких файлов, но как только они становятся достаточно большими, это очень неэффективно.

Как я могу заставить мою функцию возвращать BLOB-объект напрямую, не считывая его полностью в память?

Вот что я сейчас использую:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, Binder binder, TraceWriter log)
{
    // parse query parameter
    string fileName = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
        .Value;

    string binaryName = $"builds/{fileName}";

    log.Info($"Fetching {binaryName}");

    var attributes = new Attribute[]
    {    
        new BlobAttribute(binaryName, FileAccess.Read),
        new StorageAccountAttribute("vendorbuilds")
    };

    using (var blobStream = await binder.BindAsync<Stream>(attributes))
    {
        if (blobStream == null) 
        {
            return req.CreateResponse(HttpStatusCode.NotFound);
        }

        using(var memoryStream = new MemoryStream())
        {
            blobStream.CopyTo(memoryStream);
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Content = new ByteArrayContent(memoryStream.ToArray());
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            return response;
        }
    }
}

Мой function.json файл:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ],
  "disabled": false
}

Я не разработчик C # и не разработчик Azure, так что большая часть этого материала ускользает от меня.

1 Ответ

0 голосов
/ 03 апреля 2019

Мне нравится предложение @CSharpRocks о создании SAS и возврате ссылки на хранилище BLOB-объектов, но я также нашел эту статью, которая может быть актуальной:

https://anthonychu.ca/post/azure-functions-static-file-server/

Вот соответствующий код:

var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentType = 
    new MediaTypeHeaderValue("application/octet-stream");
return response;
...