Невозможно запустить функцию устойчивой оркестровки Azure

У меня есть простое приложение «Функции Azure», которое включает триггер HTTP и надежную функцию оркестрации, которую вызывает триггер. Это приложение работает нормально при локальном тестировании, но дает сбой при запуске в Azure. Ошибка, исходящая от функции оркестратора:

07-df83-4d2d-8023-ad4da1eed437, Duration=107ms)Unable to cast object of type 'System.String' to type 'Microsoft.Azure.WebJobs.Extensions.DurableTask.IDurableOrchestrationContext'.

Вот код HTTP-триггера:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

public static class DurableHttpStart
{
    [FunctionName("DurableHttpStart")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        // Function input comes from the request content.
        string instanceId = await starter.StartNewAsync("OrchestratorFunction", null);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

А вот код функции оркестратора:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.Logging;
using SpreadsheetGear;

public static class OrchestratorFunction
{
    [FunctionName("OrchestratorFunction")]
    public static async Task<List<string>> RunOrchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context)
    {
        var finalResult = new List<string>();
        return finalResult;
    }
}

Это приложение настроено как «--dotnet-isolated».

Есть идеи, как это можно исправить?

Microsoft.Azure.WebJobs.Extensions.DurableTask.IDurableOrche‌​strationContext.Как я вижу, ваш код является внутрипроцессным, он использует пакеты веб-заданий, которые поддерживаются только в модели in-porcess.
Vivek Vaibhav Shandilya 08.06.2024 07:51

если вы хотите настроить его в режиме isolated, я бы предложил использовать изолированные пакеты, в которых используется Microsoft.Azure.Functions.Worker.Extensions. Для долговечной функции вы можете использовать Microsoft.Azure.Functions.Worker.Extensions.DurableTask. Microsoft.Azure.WebJobs.Extensions пакеты используются для модели inporcess.

Vivek Vaibhav Shandilya 08.06.2024 07:54
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
2
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я уже упоминал в комментарии, вы используете код in-process в среде isolated. вам нужно использовать это in-process окружение.

Я также получал ту же ошибку, когда использовал аналогичный код в приложении функции модели.

Мой код: isolated:

using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace FunctionApp14
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<List<string>> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            var outputs = new List<string>();
            return outputs;
        }

        [FunctionName("Function1_HttpStart")]
        public static async Task<HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log)
        {
            // Function input comes from the request content.
            string instanceId = await starter.StartNewAsync("Function1", null);

            log.LogInformation("Started orchestration with ID = '{instanceId}'.", instanceId);

            return starter.CreateCheckStatusResponse(req, instanceId);
        }
    }
}

Function1.cs:

<Project Sdk = "Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include = "Microsoft.Azure.WebJobs.Extensions.DurableTask" Version = "2.12.0" />
    <PackageReference Include = "Microsoft.NET.Sdk.Functions" Version = "4.4.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update = "host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update = "local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

Когда я применил его к функции в модели FunctionApp14.csproj, он работал отлично.

Как я уже упоминал в комментарии, изолированная модель использует разные пакеты, как указано в этом MSDoc.

Другие вопросы по теме