Я пытаюсь перенести свои приложения функций Azure, запускаемые по протоколу HTTP, в изолированный процесс. Чтобы понять, как работает приложение «Функции» с изолированным процессом, я начал с шаблона, предоставленного основными инструментами Azure Functions (версия 4.0.5348 — последняя версия NixOS на момент написания), следуя официальному Краткому руководству .
Шаблон работает без обновления каких-либо библиотек, входящих в его комплектацию.
Можно зайти по местному адресу http://localhost:7071/api/HttpExample
и посмотреть
HTTP-ответ Welcome to Azure Functions!
.
Однако, если после того, как я обновил библиотеки до последней версии, API, активируемый HTTP, перестал работать и выдал следующее предупреждающее сообщение.
No job functions found. Try making your job classes and methods public. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
Как мне изменить базу кода из шаблонов, чтобы решить эту проблему и позволить
Приложение «Функции Azure»
запустить под последней Microsoft.Azure.Functions.Worker.Sdk
?
Версии библиотеки, поставляемые вместе с фреймворком, на момент написания таковы:
[net8.0]:
Top-level Package Requested Resolved
> Microsoft.Azure.Functions.Worker 1.19.0 1.19.0
> Microsoft.Azure.Functions.Worker.Extensions.Http 3.0.13 3.0.13
> Microsoft.Azure.Functions.Worker.Sdk 1.14.0 1.14.0
Последние версии библиотеки на момент написания:
[net8.0]:
Top-level Package Requested Resolved
> Microsoft.Azure.Functions.Worker 1.21.0 1.21.0
> Microsoft.Azure.Functions.Worker.Extensions.Http 3.1.0 3.1.0
> Microsoft.Azure.Functions.Worker.Sdk 1.17.2 1.17.2
После нескольких проб и ошибок я обнаружил, что проблема в обновлении Microsoft.Azure.Functions.Worker.Sdk
и его последняя рабочая версия с шаблоном 1.15.1
- обновление до
1.16.0
, следующая версия воспроизведет ошибку.
Microsoft.Azure.Functions.Worker.Sdk
с версии 1.16.0.func init LocalFunctionProj --worker-runtime dotnet-isolated --target-framework net8.0
cd LocalFunctionProj
func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
Microsoft.Azure.Functions.Worker.Sdk
dotnet add package Microsoft.Azure.Functions.Worker.Sdk
func start --debug --verbose
Кодовая база указана в этом репозитории GitHub.
Этот вопрос наиболее близок, но речь идет об обновлении существующего проекта, а не о создании совершенно нового.
Изолированная функция работает при использовании последних библиотек.
- func init LocalFunctionProj --worker-runtime dotnet-isolated --target-framework net8.0
- cd LocalFunctionProj
- func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
HttpExample.cs-
using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
namespace LocalFunctionProj
{
public class HttpExample
{
private readonly ILogger _logger;
public HttpExample(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<HttpExample>();
}
[Function("HttpExample")]
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString("Welcome to Azure Functions!");
return response;
}
}
}
local.settings.json-
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
}
}
программа.cs-
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.Build();
host.Run();
хост.json-
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
}
}
}
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "1.21.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Http" Version = "3.1.0" />
<PackageReference Include = "Microsoft.Azure.Functions.Worker.Sdk" Version = "1.17.3-preview1" />
</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>
Все работает после обновления The Functions Core Tools из нестабильного канала на NixOS.