Почему мне нужно добавить выходной параметр в мои выходные привязки?

Предположим, у меня есть эта подпись для моей функции Azure:

   [FunctionName("DoStuff")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
        TraceWriter log,
        [Queue("output-queue")] string outputQueue)
    {
    }

Этот метод работает только для меня, если я добавлю out параметр для выходной привязки, outputQueue, Я использую VS 2017.3.2

Примеры Microsoft НЕ используют out параметр. Почему мне нужно добавить out параметр?

3 ответа

Решение

Та документация, на которую вы ссылаетесь, может быть старой.

Вот почему нужно.

Я хочу передать набор входов в функцию (множественные триггеры) и набор выходов из функции (отправка данных в очередь, выходной эталон завершения)

Нам нужно указать, что нужно передать и что нужно отправить из функции.

функция (Class1 i, Class2 j, out Class3 k, out Class4 l) {

}

out относится к ссылке на объект, который отправляется из функции и не нуждается в десериализации объекта во время вызова.

в то время как i и j в вышеупомянутом нуждается в десериализации, в то время как Class3 и Class4 - нет.

Необходим дополнительный цикл для определения отображения и автоматического распознавания, входит ли он в параметры или нет.

Наличие 'out' делает процесс простым и помогает выполнять код быстрее.

Вам нужно использовать 'out', когда ваша функция выполняет присваивание одному из параметров. Например, если ваш параметр - строка, или byte[], или poco, вам нужно выполнить присваивание.

Вот один пример из документации, где требуется:

#load "..\shared\order.csx"

using System;

public static void Run(Order myQueueItem, out Order outputQueueItem,TraceWriter log)
{
    log.Info($"C# Queue trigger function processed order...");
    log.Info(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

Вам не нужно использовать, если ваша функция вызывает методы для параметра. Stream, ICollector и IAsyncCollector все попадают в эту категорию. Вот два примера:

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096, token);
}

А также:

#load "..\shared\order.csx"

using System.Net;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function received an order.");
    log.Info(req.ToString());
    log.Info("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

Вы упомянули, что в вашем примере кода была проблема с параметром IAsyncCollector. Как уже упоминалось, похоже, проблема в том, что ты скучаешь по [Queue(..)] приписывать.

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

[FunctionName("DoStuff")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
    TraceWriter log,
    [Queue("my-out-queue")] IAsyncCollector<DetailInfo> outputQueue)
{
}
Другие вопросы по тегам