У меня есть простое приложение «Функции 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».
Есть идеи, как это можно исправить?
если вы хотите настроить его в режиме isolated, я бы предложил использовать изолированные пакеты, в которых используется Microsoft.Azure.Functions.Worker.Extensions. Для долговечной функции вы можете использовать Microsoft.Azure.Functions.Worker.Extensions.DurableTask. Microsoft.Azure.WebJobs.Extensions пакеты используются для модели inporcess.


Как я уже упоминал в комментарии, вы используете код 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.
Microsoft.Azure.WebJobs.Extensions.DurableTask.IDurableOrchestrationContext.Как я вижу, ваш код является внутрипроцессным, он использует пакеты веб-заданий, которые поддерживаются только в моделиin-porcess.