Функция не может привязать к выходному параметру
У меня есть функция Azure с TimerTrigger
это работает и производит 400000 сообщений темы служебной шины. В настоящее время я использую API служебной шины, чтобы вручную вставлять в него сообщения в своей функции. Теперь я хочу заменить этот код на выходную привязку, что упрощает работу.
public static class Function1
{
[FunctionName("ExportProcessor")]
public static async Task Run(
[TimerTrigger("0 30 5 */1 * *", RunOnStartup = true)]TimerInfo myTimer,
ILogger logger,
[ServiceBus("new-movie-publish", EntityType = EntityType.Topic)]IAsyncCollector<string> output)
{
await output.AddAsync("Foo");
await output.AddAsync("Bar");
}
}
Проблема, однако, в том, что когда я запускаю этот тестовый код, он завершается с этой ошибкой:
MicrosoftAzure.WebJobs.Host: Ошибка индексации метода 'Function1.Run'. Microsoft.Azure.WebJobs.Host: Невозможно привязать параметр 'output' к типу IAsyncCollector`1. Убедитесь, что параметр Type поддерживается привязкой.
При чтении документации, IAsyncCollector
1` - поддерживаемая привязка.
Обновлен для отображения конфигурационных файлов и зависимостей.
Это мой файл.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="1.50.4" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta4" />
<PackageReference Include="Microsoft.Azure.WebJobs.ServiceBus" Version="3.0.0-beta4" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.9" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>
Мой файл host.json:
{
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Information",
"Function": "Information"
}
}
}
}
и мой конфиг local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "...",
"APPINSIGHTS_INSTRUMENTATIONKEY": "...",
"ExportUrl": "...",
"ExportUtcHour": 5,
"DefaultConnection": "...",
"NewMovieTopic": "new-movie-publish",
"AzureWebJobsServiceBus": "..."
}
}
Эти параметры работают нормально, когда я использую этот код для публикации сообщений:
public class MoviePublisherConfig
{
public MoviePublisherConfig()
{
this.AzureWebJobsServiceBus = Environment.GetEnvironmentVariable(nameof(AzureWebJobsServiceBus), EnvironmentVariableTarget.Process);
this.NewMovieTopic= Environment.GetEnvironmentVariable(nameof(NewMovieTopic), EnvironmentVariableTarget.Process);
}
public string AzureWebJobsServiceBus { get; set; }
public string NewMovieTopic { get; set; }
}
public class MoviePublisher
{
private readonly MoviePublisherConfig config;
private readonly ILogger logger;
public MoviePublisher(MoviePublisherConfig config, ILogger logger)
{
this.config = config ?? throw new ArgumentNullException(nameof(config));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task PublishMovies(Movie[] movies)
{
var topicClient = new TopicClient(config.AzureWebJobsServiceBus, config.NewMovieTopic);
var pendingTasks = new List<Task>();
for(int index = 0; index < movies.Length; index++)
{
string movieJson = JsonConvert.SerializeObject(movies[index]);
byte[] messageBuffer = Encoding.UTF8.GetBytes(movieJson);
var message = new Message(messageBuffer);
Task sendTask = topicClient.SendAsync(message);
pendingTasks.Add(sendTask);
if (pendingTasks.Count >= 1000)
{
await Task.WhenAll(pendingTasks);
this.logger.LogInformation($"Processed {pendingTasks.Count} new movies.");
pendingTasks.Clear();
}
}
}
}
Что я здесь не так делаю?
1 ответ
На сегодняшний день (март 2018 г.) поддержка служебной шины для функций V2 все еще находится в стадии разработки. Это вроде как, но требует применения магии.
Проблема заключается в том, что он был перемещен из пакета привязок по умолчанию в модель расширений, и он все еще груб.
Смотрите следующие проблемы на GitHub:
Перенести расширение Service Bus на.NET Core - закрыто, но смотрите комментарии
Ошибка сборки после установки ExtensionsMetadatGenerator в пустое приложение v2
Рабочая версия еще не в NuGet, но если вам действительно нужно, вы можете получить ее в MyGet, версия 3.0.0-beta4-11250.
Другие варианты включают залипание при ручной отправке или использование полной версии функций V1 / .NET.