Почему мне нужно добавить выходной параметр в мои выходные привязки?
Предположим, у меня есть эта подпись для моей функции 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)
{
}