Пользовательские привязки в функции Azure не разрешаются - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать свою собственную привязку для функций Azure. Эта работа основана на 2 статьях вики, касающихся этой функции: https://github.com/Azure/azure-webjobs-sdk/wiki/Creating-custom-input-and-output-bindings а также https://github.com/Azure/WebJobsExtensionSamples

В качестве примера проекта я имею в виду пример проекта расширения привязки Azure Functions / WebJobs . Этот проект основан на .NET Framework 4.6.

Я хочу, чтобы моя собственная привязка работала с функциями Azure v2, поэтому я нацеливаюсь на NetStandard2 во всех моих проектах.

В примере проекта я вижу, что расширение привязки загружается при запуске локального эмулятора.

[3-1-2019 08:48:02] Загруженное расширение привязки 'SampleExtensions' from ', на которое ссылается: Method =' FunctionApp.WriterFunction.Run ', Parameter =' sampleOutput '.'

Однако я никогда не вижу, чтобы эта строка появлялась при запуске моего собственного связывающего расширения.

Я сделал следующее. Сначала я создал новый атрибут.

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)]
[Binding]
public class MySimpleBindingAttribute : Attribute
{
    /// <summary>
    /// Path to the folder where a file should be written.
    /// </summary>
    [AutoResolve]
    public string Location { get; set; }
}

И довольно простой класс расширения

public class MySimpleBindingExtension : IExtensionConfigProvider
{
    public void Initialize(ExtensionConfigContext context)
    {
        var rule = context.AddBindingRule<MySimpleBindingAttribute>();
        rule.BindToInput<MySimpleModel>(BuildItemFromAttribute);
    }

    private MySimpleModel BuildItemFromAttribute(MySimpleBindingAttribute arg)
    {
        string content = default(string);
        if (File.Exists(arg.Location))
        {
            content = File.ReadAllText(arg.Location);
        }

        return new MySimpleModel
        {
            FullFilePath = arg.Location,
            Content = content
        };
    }
}

И конечно же модель.

public class MySimpleModel
{
    public string FullFilePath { get; set; }
    public string Content { get; set; }
}

Из того, что я читал в вики, я думаю, этого будет достаточно, чтобы использовать его в моем проекте функций Azure. Функция выглядит следующим образом.

[FunctionName("CustomBindingFunction")]
public static IActionResult Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "{name}")]
    HttpRequest req,
    string name,
    [MySimpleBinding(Location = "%filepath%\\{name}")]
    MySimpleModel simpleModel)
{
    return (ActionResult) new OkObjectResult(simpleModel.Content);
}

При запуске в эмуляторе я вижу следующие сообщения об ошибках и предупреждения.

[3-1-2019 08:51:37] Ошибка индексации метода 'CustomBindingFunction.Run'

[3-1-2019 08:51:37] Microsoft.Azure.WebJobs.Host: Ошибка индексации метода 'CustomBindingFunction.Run'. Microsoft.Azure.WebJobs.Host: Невозможно привязать параметр 'simpleModel' к типу MySimpleModel. Убедитесь, что параметр Type поддерживается привязкой. Если вы используете привязки расширений (например, хранилище Azure, ServiceBus, таймеры и т. Д.), Убедитесь, что вы вызвали метод регистрации расширений в своем коде запуска (например, builder.AddAzureStorage (), builder.AddServiceBus ( ), builder.AddTimers () и т. д.).

[3-1-2019 08:51:37] Функция 'CustomBindingFunction.Run' не прошла индексацию и будет отключена.

[3-1-2019 08:51:37] Функции не найдены. Попробуйте сделать ваши классы и методы работы публичными. Если вы используете привязки расширений (например, хранилище Azure, ServiceBus, таймеры и т. Д.), Убедитесь, что вы вызвали метод регистрации расширений в своем коде запуска (например, builder.AddAzureStorage (), builder.AddServiceBus ( ), builder.AddTimers () и т. д.).

Теперь, это сообщение имеет смысл в сценарии WebJob, но для функции Azure у вас нет места для установки чего-либо в коде запуска. При вызове функции выдается следующее сообщение.

[3-1-2019 08:53:13] Произошла необработанная ошибка хоста.

[3-1-2019 08:53:13] Microsoft.Azure.WebJobs.Host: «CustomBindingFunction» не может быть вызвано из Azure WebJobs SDK. В нем отсутствуют атрибуты Azure WebJobs SDK?.

Я прочитал кое-что о добавлении файла extensions.json и использовании AzureWebJobs_ExtensionsPath (для v1) , но те, которые не появляются, ничего не делают (или я сделал что-то не так) ,

Есть идеи, как поступить?

Для полноты, вот мои текущие ссылки на пакеты NuGet.

<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.3" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.24" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />

1 Ответ

0 голосов
/ 18 января 2019

Благодаря некоторой помощи и руководству другими примерами мне удалось выяснить, что нужно добавить в данный момент, чтобы ваши пользовательские привязки работали.

Я предполагаю, что со временем это изменится в следующих выпускахвремя выполнения, но кто знает ...

Сначала добавьте небольшой метод расширения, в котором вы добавляете свое расширение к IWebJobsBuilder.

public static class MySimpleBindingExtension
{
    public static IWebJobsBuilder AddMySimpleBinding(this IWebJobsBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        builder.AddExtension<MySimpleBinding>();
        return builder;
    }
}

Далее идет реализация IWebJobsStartup,Это будет обнаружено при запуске через среду выполнения.

public class MySimpleBindingStartup : IWebJobsStartup
{
    public void Configure(IWebJobsBuilder builder)
    {
        builder.AddMySimpleBinding();
    }
}

Одна вещь, которую вы не должны забывать, это добавить следующее к этому классу:

[assembly: WebJobsStartup(typeof(MySimpleBindingStartup))]

Вы будетезаметьте это достаточно скоро, потому что если вы забудете, привязка не будет снята.

Надеюсь, это поможет всем, кто столкнулся с той же проблемой, что и я.Если вы хотите увидеть полный код, у меня есть пример проекта в репозитории GitHub: https://github.com/Jandev/CustomBindings

...