为什么我需要向我的输出绑定添加一个 out 参数?

Why do I need to add an out parameter to my output bindings?

假设我的 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参数?

您所指的文档可能是旧的。

这就是为什么需要 out 的原因。

我想将一组输入传递给函数(多个触发器)和函数的一组输出(将数据发送到队列,完成的输出参考)

我们需要指示需要传递什么以及需要从函数中发送什么。

函数(Class1 i,Class2 j,输出 Class3 k,输出 Class4 l){

}

out指的是发送出函数的对象的引用,调用时不需要反序列化对象。

而上面的i和j需要反序列化,而Class3和Class4则不需要。

需要额外的循环来判断映射,自动识别是in还是out参数。

'out' 使过程变得简单并有助于更快地执行代码。

我相信您缺少一个属性来表示输出绑定的类型。例如,如果您想使用存储队列,请将您的函数声明为

[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)
{
}

当您的函数正在对其中一个参数进行赋值时,您需要使用 'out'。例如,如果您的参数是一个字符串,或一个 byte[],或一个 poco,您将需要进行赋值。

这是文档中需要 out 的一个示例:

#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;
}

如果您的函数正在调用参数上的方法,则不需要使用 out。 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(..)] 属性。