为什么我需要在输出绑定中添加out参数?

时间:2017-09-08 19:13:03

标签: azure azure-functions

假设我的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 个答案:

答案 0 :(得分:1)

您所指的文档可能已旧。

这就是为什么需要out。

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

我们需要指出需要传递的内容以及需要从函数中发送的内容。

功能(Class1 i,Class2 j,out Class 3 k,out Class4 l){

}

out指的是发送出函数的对象的引用,并且在调用期间不需要对象的反序列化。

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

需要额外的周期来确定映射并自动识别它是否为参数。

使用'out'可以简化流程并有助于更快地执行代码。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你需要使用&#39; out&#39;当您的函数正在对其中一个参数进行赋值时。例如,如果您的参数是字符串,字节[]或poco,则您需要进行分配。

以下是文档中需要输出的一个示例:

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

如果您的函数正在调用参数上的方法,则不需要使用。 Stream,ICollector和IAsyncCollector都属于这一类。以下是两个例子:

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

[Queue(..)]

您提到您的示例代码存在IAsyncCollector参数问题。正如其他人所提到的,问题似乎是您错过了class属性。