Условно вывод в хранилище BLOB-объектов с функциями Azure - PullRequest
1 голос
/ 05 февраля 2020

У меня есть функция HTTP, которая возвращает код состояния, но я также хочу связать вывод с большим двоичным объектом. Но когда запрос недействителен, я вообще не хочу создавать выходной BLOB-объект. Я пробовал что-то вроде:

public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "{userName}/messages")] HttpRequest req,
    string userName,
    [Blob("users/{userName}/{DateTime}.json", FileAccess.Write)] Stream outputStream)
{
    if (IsValid(req.Body))
    {
        await req.Body.CopyToAsync(outputStream);
        return new AcceptedResult();
    }
    else
    {
        return new BadRequestResult();
    }
}

Но, к сожалению, выходной BLOB-объект создается всегда, даже когда возвращается BadRequest. (Созданный файл пуст, но я не хочу, чтобы он вообще создавался.)

Я также пытался установить outputStream = null непосредственно перед возвращением BadRequest, но это не помогло.

Есть ли способ conditioanl создать файл BLOB-объекта?

1 Ответ

1 голос
/ 06 февраля 2020

В функции BLOB-объектов, когда {DateTime}.json не существует в контейнере, автоматически создаст BLOB-объект . Таким образом, если вы установите путь к выходному BLOB-объекту на users/{userName}/{DateTime}.json, система автоматически создаст для вас новый файл datetime. json, чтобы всегда создавался выходной BLOB-объект.

Итак, вы можете использовать следующий код для условного создания файла BLOB-объекта.

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function,  "post", Route = "{userName}/messages")] HttpRequest req, 
    string userName,
    [Blob("users/{userName}", Connection = "StorageConnectionString")] CloudBlobContainer outputContainer)
    {
        if (IsValid(req.Body))
        {
            await outputContainer.CreateIfNotExistsAsync();
            var requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            var blobName = DateTime.Now.ToString() + ".json";
            var cloudBlockBlob = outputContainer.GetBlockBlobReference(blobName);
            await cloudBlockBlob.UploadTextAsync(requestBody);
            return new AcceptedResult();
        }else{
            return new BadRequestObjectResult("bad request");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...