Я пытаюсь создать свою собственную привязку для функций 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" />