假设我的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
参数?
答案 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
属性。