从 .NET 3 迁移到 .NET 5 时,Azure 函数中出现错误“未找到语言 [dotnet-isolated] 的函数”

Posted

技术标签:

【中文标题】从 .NET 3 迁移到 .NET 5 时,Azure 函数中出现错误“未找到语言 [dotnet-isolated] 的函数”【英文标题】:Error "Did not find functions with language [dotnet-isolated]" in Azure Function when migrating from .NET 3 to .NET 5 【发布时间】:2021-11-05 07:54:38 【问题描述】:

我正在尝试将在 .NET 3.1 上完美运行的 Azure 函数迁移到 .NET 5。 我按照 Microsoft 的 GitHub 指南进行操作,但仍然无法在本地运行或调试(甚至没有尝试发布到 Azure)。

我收到此错误:

[2021-09-05T09:49:33.066Z] A host error has occurred during startup operation 'bb37a6db-b6f4-4396-bb9b-cb5ae0bba387'.
[2021-09-05T09:49:33.067Z] Microsoft.Azure.WebJobs.Script: Did not find functions with language [dotnet-isolated].

并且正在引发此异常:

这是我的 Program.cs:

static async Task Main(string[] args)
        
            var host = new HostBuilder()
               .ConfigureAppConfiguration(c =>
               
                   c.AddCommandLine(args);
               )
               .ConfigureServices(s =>
               
                   s.AddLogging();
               )
               .Build();

            await host.RunAsync();
        

这是我的项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
    <UserSecretsId>76d0a5ed-221b-4b35-8ff4-3ee33d393196</UserSecretsId>
    <OutputType>Exe</OutputType>
    <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
  </PropertyGroup>
  <ItemGroup>
    <None Remove="global.json" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="global.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.5.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage" Version="4.0.4" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.0.4" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.2" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.11.1" />
    <PackageReference Include="System.Linq.Async" Version="5.0.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="config.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

我的 local.settings.json:


  "IsEncrypted": false,
  "Values": 
    "AzureWebJobsStorage": "HIDDEN",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
  

我的 host.json:


  "logging": 
    "fileLoggingMode": "always",
    "logLevel": 
      //"QueueWorkers.EmailQueueWorker": "Trace",
      //"QueueWorkers.EmailQueueWorker.EmailQueueWorker": "Trace",
      "default": "Information",
      "Function": "Trace",
      "Host.Results": "Error",
      "Host.Aggregator": "Trace"
    ,
    "applicationInsights": 
      //"samplingExcludedTypes": "Request",
      "samplingSettings": 
        "isEnabled": true
      
    ,
    "console": 
      "isEnabled": "true"
    
  ,
  "Values": 
    "AzureWebJobsStorage": "HIDDEN",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
  ,
  "extensions": 
    "queues": 
      "maxDequeueCount": 5,
      "maxPollingInterval": "00:00:02"
    
  ,
  "version": "2.0"

谢谢

【问题讨论】:

这能回答你的问题吗? How can I debug Azure Functions using .NET 5 (isolated process) in Visual Studio? 这对我有帮助:"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" 谢谢!!! 【参考方案1】:

在 Azure 中导航到您的函数,然后更改设置:

"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"

【讨论】:

【参考方案2】:

好吧,仍然无法直接从 VS 2019 启动和调试,但如果从 CLI 启动并且调试正常,则功能确实有效。

    Debugger.Launch(); 添加到 Program.cs(Main 方法的第一行) 确保您的 csproj 中有 &lt;LangVersion&gt;preview&lt;/LangVersion&gt;(在 TargetFramework 之后)。这条缺失的行实际上是导致我的函数无法正常工作的关键差异。 从 CLI 启动(从函数文件夹):“func start --verbose”

谢谢

【讨论】:

【参考方案3】:

在尝试将项目从 .net 5 迁移到 .net 6 函数时,在 Visual Studio 2022 中遇到了类似问题...

一直告诉我“Microsoft.Azure.WebJobs.Script:没有找到使用语言 [dotnet-isolated] 的函数”

我的解决方案

1) 我丢失了:Program.cs

using Microsoft.Azure.Functions.Worker.Configuration;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;

namespace Main.Function

    public class Program
    
        public static void Main()
        
            var host = new HostBuilder()
                .ConfigureFunctionsWorkerDefaults()
                .Build();

            host.Run();
        
    

2) 编辑 .csproj > 在 ItemGroup 下...

删除:

<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" />

替换为

<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" OutputItemType="Analyzer" />
      <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.6.0" />
      <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="4.0.1" />

3) 确保 OutputType 设置为 exe

<OutputType>Exe</OutputType>

4)卸载项目并重新加载(构建前删除bin和obj文件夹)

【讨论】:

以上是关于从 .NET 3 迁移到 .NET 5 时,Azure 函数中出现错误“未找到语言 [dotnet-isolated] 的函数”的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure 函数 NET 5 迁移到 NET 6 - 现在如何注册中间件

Azure Devops - 在 Nuget 包中从 .NET Core 3.1 迁移到 .NET 5 的兼容性问题

从 2.2 .Net core 迁移到 3.0 Cors 错误

从 .NET Core 2.1 迁移到 .NET Core 3.1 后,publish 有问题

从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

将 dotnet 隔离的进程 Azure Function 从 .net 5 迁移到 .net 6