几个月来,我部署了 .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();
有什么帮助吗?谢谢你
.ConfigureFunctionsWorkerDefaults()
,请参阅启动和配置。您需要致电 .ConfigureFunctionsWebApplication()
进行 ASP.NET Core 集成。.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)