Power Automate Flow — функция HTTP не ждет ответаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Power Automate Flow — функция HTTP не ждет ответа

Сообщение Anonymous »

Я провожу худшее время в своей жизни, пытаясь заставить работать этот поток Power Automate.
Я создал поток Power Automate, извлекающий заказ на покупку из счетов-фактур. Он срабатывал при каждом новом письме в почтовом ящике. Я просматриваю вложения в формате PDF, звоню разработчику ИИ, чтобы извлечь информацию из счета-фактуры и получить заказ на поставку.
Мне нужны были более точные варианты поиска заказа на поставку, поэтому я перешел логика извлечения заказа на покупку в вызов API. Теперь поток просто отправляет PDF-файл в конечную точку, и я могу обрабатывать все функции C# и возвращать необходимые данные, чтобы поток мог продолжиться.
Этот вызов API занимает около 20 секунд в Почтальон.
Когда я пытаюсь вызвать его в своем потоке, время ожидания истекает.
Я подключил отладчик к своему API и обнаружил, что это правильно, когда я жду ответ от AI-клиента, Flow повторно отправляет запрос. В результате получается бесконечный цикл.
Я знаю, что вызов конечной точки работает, потому что я могу вернуть ответ «ОК» до вызова AI, и это сработает.
Как мне это сделать? заставить мой HTTP-запрос ждать этого результата?
Или это проблема с асинхронностью AI-вызова клиента?
Во время отладки я заметил, что моя точка останова всегда теряется на первый вызов aiClient, который является первой асинхронной операцией в вызове.
Изображение

Вот представление кода HTTP-вызова в Power Automate

Код: Выделить всё

    "inputs": {
"method": "POST",
"uri": "REDACTED",
"headers": {
"Connection": "keep-alive",
"Accept": "*/*",
"Host": "REDACTED",
"Accept-Encoding": "gzip, deflate, br"
},
"body": {
"$content-type": "multipart/form-data",
"$multipart": [
{
"headers": {
"Content-Disposition": "form-data; name=\"invoicePdf\"; filename=\"invoicePdf.pdf\""
},
"body": "@outputs('Get_file_content')"
}
]
},
"authentication": {
"type": "Basic",
"username": "REDACTED",
"password": "REDACTED"
}
},
"operationOptions": "DisableAsyncPattern",
"metadata": {
"operationMetadataId": "38dae010-f79b-4c3e-ae7c-22a6047b4151"
}
}
Вот мой метод C# с вызовами AI:

Код: Выделить всё

        {
// Check if a file was uploaded
if (invoicePdf == null || invoicePdf.Length == 0)
{
return BadRequest("No file uploaded.");
}

// Check if the file is a PDF
if (!invoicePdf.FileName.EndsWith(".pdf"))
{
return BadRequest("Only PDF files are allowed.");
}

AzureKeyCredential credential = new AzureKeyCredential(AppSettings.AzureAiServiceKey);
DocumentAnalysisClient aiClient = new DocumentAnalysisClient(new Uri(AppSettings.AzureAiServiceEndpoint), credential);

//var operation = await aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoicePdf.OpenReadStream());
var invoiceOperation = aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice",
invoicePdf.OpenReadStream(), new AnalyzeDocumentOptions
{
Pages = { "1-2" }
}).Result;

var invoiceResult = invoiceOperation.Value;

//check default area
for (int i = 0; i < invoiceResult.Documents.Count; i++)
{
var document = invoiceResult.Documents[i];

//try to find the purchase order from the default area
if (document.Fields.ContainsKey("PurchaseOrder"))
{
document.Fields.TryGetValue("PurchaseOrder", out var purchaseOrderObject);

var purchaseOrderValue = purchaseOrderObject.Content;
var purchaseOrderConfidence = purchaseOrderObject.Confidence;

var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(purchaseOrderValue);

return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = purchaseOrderConfidence,
FoundIn = "Default Location"
});
}
}

var layoutOperation = aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-document",
invoicePdf.OpenReadStream(), new AnalyzeDocumentOptions
{
Pages = { "1-2"  }
}).Result;

var layoutResult = layoutOperation.Value;
DocumentKeyValuePair? poKeyValuePair;

poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => firstPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => secondPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => thirdPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => fourthPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => fifthPriorityKeys.Contains(x.Key.Content));
}
}
}
}

if (poKeyValuePair != null)
{
var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(poKeyValuePair.Value.Content);

return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = poKeyValuePair.Confidence,
FoundIn = $"{poKeyValuePair.Key.Content} (KVP)"
});
}

//check plain text with regex
Regex regex =
new Regex(@"([Pp][Oo]|[Pp][Uu][Rr][Cc][Hh][Aa][Ss][Ee]\s?[Oo][Rr][Dd][Ee][Rr]).{0,3}(\d{7})");
Match match = regex.Match(layoutResult.Content);
if (match.Success)
{
var foundPo = match.Value;
var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(foundPo);

return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = 0.5,
FoundIn = "Plain Text Regex Parse"
});

}

return Ok(new
{
Found = false
});
}
Сводка

[*]HTTP-вызов Power Automate Flow не ждет ответа
[*]Это работает в Postman, но занимает около 20 секунд.
[*]Можно ли как-нибудь заставить Flow ждать этого ответа? >


Подробнее здесь: https://stackoverflow.com/questions/792 ... r-response
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Power Automate: как выполнить Anaconda Ambient
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Power Automate: как выполнить Anaconda Ambient
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Невозможно запустить поток Power Automate с помощью скрипта Python.
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Невозможно запустить поток Power Automate с помощью скрипта Python.
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как Power Automate Desktop передает экземпляр Excel
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»