为什么我需要向我的输出绑定添加一个 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(..)]
属性。
假设我的 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(..)]
属性。