Я хочу создать простую функцию Azure, которая запускается при загрузке большого двоичного объекта.
Функция работает правильно, как и ожидалось, когда я запускаю ее локально. Проблема в том, что когда я публикую код с опцией публикации Visual Studio 2022, я получаю исключение, и функция вообще не выполняется. Насколько я понял, проблема в том, что аргумент функции "Stream" по какой-то странной причине не может быть привязан.
Это исключение, которое я получаю:
Ошибка преобразования 1 входного параметра для функции «BlobTriggeredFunction»: невозможно преобразовать входной параметр «поток» в тип «System.IO.Stream» из типа «Microsoft.Azure.Functions.Worker.Grpc.Messages.GrpcModelBindingData». Ошибка: System.FormatException: настройки должны иметь форму «имя=значение». в Azure.Storage.StorageConnectionString.<>c.b__67_0 (ошибка строки) в Azure.Storage.StorageConnectionString.ParseStringIntoSettings (String ConnectionString, ошибка Action
1 error) at Azure.Storage.StorageConnectionString.ParseCore(String connectionString, StorageConnectionString& accountInformation, Action
1) в Azure.Storage.StorageConnectionString.Parse(String ConnectionString) в Azure.Storage.Blobs.BlobServiceClient..ctor (String ConnectionString, параметры BlobClientOptions) в Microsoft.Azure.Functions.Worker.BlobStorageBindingOptions.CreateClient() в D:\a_work\1\s\extensions\Worker.Extensions.Storage.Blobs\src\Config\BlobStorageBindingOptions.cs:строка 35 в Microsoft.Azure.Functions.Worker.BlobStorageConverter.CreateBlobContainerClient(String ConnectionName, StringContainerName) в D:\a_work\1\s\extensions\Worker.Extensions.Storage.Blobs\src\BlobStorageConverter.cs:строка 253 в Microsoft.Azure.Functions.Worker.BlobStorageConverter.ConvertModelBindingDataAsync(Type targetType, BlobBindingData blobData) в D:\a_work\1\s\extensions\Worker.Extensions.Storage.Blobs\src\BlobStorageConverter.cs:строка 118 в Microsoft.Azure.Functions.Worker.BlobStorageConverter.ConvertFromBindingDataAsync(ConverterContext context, ModelBindingData modelBindingData) в D:\a_work\1\s\extensions\Worker.Extensions.Storage.Blobs\src\BlobStorageConverter.cs:строка 63
Это код функции:
public class BlobTriggeredFunction(ILogger<BlobTriggeredFunction> logger)
{
[Function(nameof(BlobTriggeredFunction))]
public async Task Run([BlobTrigger("email-attachments/{name}", Connection = "BlobStorageConnectionString")] Stream stream, string name)
{
using var blobStreamReader = new StreamReader(stream);
var content = await blobStreamReader.ReadToEndAsync();
logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {content}");
}
}
Это настройка в Program.cs:
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureAppConfiguration((hostContext, config) =>
{
config.AddJsonFile("host.json");
if (hostContext.HostingEnvironment.IsDevelopment())
{
config.AddJsonFile("local.settings.json");
config.AddUserSecrets<Program>();
}
})
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
секреты.json:
{
"BlobStorageConnectionString": "xxxxxxxxxxxxxxxxxxxxxxx",
"BlobStorageConnectionString:blob": "https://xxxxxxxxxxxxxxx.blob.core.windows.net/",
"BlobStorageConnectionString:queue": "https://xxxxxxxxxxxxxxx.queue.core.windows.net/"
}
Я попытался изменить аргумент «Stream» на byte[] или строку, но ничего из этого не помогло. Я не ожидаю, что проблема в строке подключения, поскольку функция срабатывает, когда я загружаю большой двоичный объект, но его невозможно обработать. Худшая проблема заключается в том, что это происходит только в среде Azure, когда я публикую код. Он отлично работает в локальной среде.
Да. Это изолированная функция Azure dotnet core 8.
local.settings.json используется только в локальной среде в отладочной сборке. Кроме того, файл local.settings.json не копируется для публикации выходных данных и не существует при развертывании приложения на портале Azure.
Я создал образец функции Azure Blob Trigger и могу запустить развернутую функцию Azure на портале.
Фрагмент кода:
public Function1(ILogger<Function1> logger)
{
_logger = logger;
}
[Function(nameof(Function1))]
public async Task Run([BlobTrigger("sampleitems/{name}", Connection = "storageconnection")] Stream stream, string name)
{
using var blobStreamReader = new StreamReader(stream);
var content = await blobStreamReader.ReadToEndAsync();
_logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {content}");
}
Если «StorageAccountConnectionString» определен как секрет пользователя в secrets.json
, вам необходимо добавить секреты пользователя в файл program.cs.
.ConfigureAppConfiguration(config => { config.AddUserSecrets<YourFunctionName>(optional: true, reloadOnChange: false); })
Программа.cs:
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureAppConfiguration( config =>
{
config.AddUserSecrets<Function1>(optional: true, reloadOnChange: false);
})
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
Добавьте строку подключения в качестве переменной среды в Azure function App=>Settings=>Environment Variables=>New Application Setting
.
Развернули функцию Blob Trigger в Azure.
Портал:
Использованная литература:
Секреты пользователя следует использовать только в локальной среде и отладочной сборке. Переменные среды используются в сборке выпуска и при развертывании приложения на портале Azure.
Я понятия не имею, почему переменные среды включены по умолчанию в вашем случае, а не в моем.
Проблема заключалась в том, что я не добавил переменные среды в Program.cs. Переменные среды используются на портале Azure.
.ConfigureAppConfiguration( ( hostContext, config ) =>
{
config.AddJsonFile( "host.json" );
if (hostContext.HostingEnvironment.IsDevelopment())
{
config.AddJsonFile("local.settings.json");
config.AddUserSecrets<ArchiveManagerFunction>(optional: true, reloadOnChange: false);
}
config.AddEnvironmentVariables();
} )
Итак, решение моей проблемы было в этой строке кода:
config.AddEnvironmentVariables();
Это изолированная функция Azure .NET8?