.NET 8 Azure Function.ConfigureFunctionsWebApplication() 和同步操作是不允许的

问题描述 投票:0回答:1

几个月来,我部署了 .NET 8 azure 函数项目,没有出现任何问题。

今天,它在任何部署尝试中都出错了,我注意到

program.cs
中的错误,
.ConfigureFunctionsWorkerDefaults()
应该是
.ConfigureFunctionsWebApplication()
请参阅 here

更改后,我的所有回复都开始抛出错误:

System.InvalidOperationException:不允许同步操作。改为调用 WriteAsync 或将 AllowSynchronousIO 设置为 true。
在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.Write

我找到了一些将

AllowSynchronousIO
设置为 true 的方法,但它们与 .NET Core 3 或 6 相关。与 .NET 8 无关。

我知道我可以更改为

await response.WriteAsJsonAsync(
,但随后我将不得不更改 API 的所有使用者,并且需要更改很多。

如何在我的

AllowSynchronousIO
中将
program.cs
添加为 true?

var host = new HostBuilder() 
                   .ConfigureFunctionsWebApplication()
                   .ConfigureServices(services =>
                        {
                            services.AddApplicationInsightsTelemetryWorkerService();
                            services.ConfigureFunctionsApplicationInsights();
                        })
                   .Build();
host.Run();

有什么帮助吗?谢谢你

azure-functions .net-8.0
1个回答
0
投票
  • 您仍然可以在program.cs文件中使用
    .ConfigureFunctionsWorkerDefaults()
    ,请参阅启动和配置。您需要致电
    .ConfigureFunctionsWebApplication()
    进行 ASP.NET Core 集成

enter image description here

  • 如果您使用
    .ConfigureFunctionsWorkerDefaults()
    那么您应该在上述文件中包含以下代码。

function.cs -

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

namespace _78408121
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function("Function1")]
        public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");
            var response = req.CreateResponse();
            response.Headers.Add("Content-Type", "application/json");
            response.WriteString("Welcome to Azure Functions!");
            return response;
        }
    }
}

program.cs -

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

.csproj -

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>_78408121</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.1.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
  </ItemGroup>
</Project>
  • 如果您选择使用
    .ConfigureFunctionsWebApplication()
    那么您应该在上述文件中包含以下代码。

function.cs -

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

namespace _78408121
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function("Function1")]
        public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");
            var response = req.CreateResponse();
            response.Headers.Add("Content-Type", "application/json");
            response.WriteString("Welcome to Azure Functions!");
            return response;
        }
    }
}

program.cs -

using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
        services.Configure<KestrelServerOptions>(options =>
        {
            options.AllowSynchronousIO = true;
        });
    })
    .Build();

host.Run();

.csproj -

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>_78408121</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.1.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
  </ItemGroup>
</Project>

我得到了预期的回应。

Azure Functions Core Tools
Core Tools Version:       4.0.5611 Commit hash: N/A +591b8aec842e333a87ea9e23ba390bb5effe0655 (64-bit)
Function Runtime Version: 4.31.1.22191

[2024-05-02T08:53:19.367Z] Found C:\Users\***\source\repos\78408121\78408121\78408121.csproj. Using for user secrets file configuration.
[2024-05-02T08:53:22.702Z] Azure Functions .NET Worker (PID: 29100) initialized in debug mode. Waiting for debugger to attach...
[2024-05-02T08:53:22.746Z] Worker process started and initialized.

Functions:

        Function1: [GET,POST] http://localhost:7045/api/Function1

For detailed output, run func with --verbose flag.
[2024-05-02T08:53:27.815Z] Host lock lease acquired by instance ID '000000000000000000000000BF6D1ED5'.
[2024-05-02T08:53:33.028Z] Executing 'Functions.Function1' (Reason='This function was programmatically called via the host APIs.', Id=c64ef602-184b-42cd-a32c-23f53cef5b26)
[2024-05-02T08:53:33.227Z] C# HTTP trigger function processed a request.
[2024-05-02T08:53:33.285Z] Executed 'Functions.Function1' (Succeeded, Id=c64ef602-184b-42cd-a32c-23f53cef5b26, Duration=271ms)

enter image description here

  • 所报告的问题正在进行一些开发,请参阅此github问题
© www.soinside.com 2019 - 2024. All rights reserved.