Функция не может привязать к выходному параметру

У меня есть функция 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 поддерживается привязкой.

При чтении документации, IAsyncCollector1` - поддерживаемая привязка.

Обновлен для отображения конфигурационных файлов и зависимостей.

Это мой файл.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.

Другие вопросы по тегам