Azure Function中的自定义绑定未得到解析



我正在尝试为Azure函数创建自己的自定义绑定。这项工作基于2篇关于此功能的wiki文章:https://github.com/Azure/azure-webjobs-sdk/wiki/Creating-custom-input-and-output-bindings和https://github.com/Azure/WebJobsExtensionSamples

对于一个示例项目,我指的是Azure函数/WebJobs绑定扩展示例项目。此项目基于。NET框架4.6。

我希望我自己的自定义绑定能与Azure函数v2一起使用,所以我在所有项目中都以NetStandard2为目标。

在示例项目中,我看到在启动本地模拟器时正在加载绑定扩展。

[3-2019 08:48:02]已从"referenced by"加载绑定扩展"SampleExtensions":Method='FunctionApp。WriterFunction。Run',参数="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-2019 08:51:37]索引方法"CustomBindingFunction"时出错。运行

[3-1-2019 08:51:37]微软。蔚蓝色的WebJobs。主机:索引方法"CustomBindingFunction"时出错。运行'。微软蔚蓝色的WebJobs。主机:无法将参数"simpleModel"绑定到类型MySimpleModel。请确保绑定支持参数Type。如果您正在使用绑定扩展(例如Azure Storage、ServiceBus、Timers等),请确保您已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage()、builder。AddServiceBus(),生成器。AddTimers()等)。

[3-1-2019 08:51:37]函数的CustomBindingFunction。Run"索引失败,将被禁用。

[3-1-2019 08:51:37]未找到作业功能。试着公开你的作业类和方法。如果您正在使用绑定扩展(例如Azure Storage、ServiceBus、Timers等),请确保您已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage()、builder。AddServiceBus(),生成器。AddTimers()等)。

现在,此消息在WebJob场景中是有意义的,但对于Azure功能,您没有在启动代码中设置内容的位置。调用函数会抛出以下消息。

[3-2019 08:53:13]发生未处理的主机错误。

[3-1-2019 08:53:13]微软。蔚蓝色的WebJobs。主机:无法从Azure WebJobs SDK调用"CustomBindingFunction"。它是否缺少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" />

在其他示例的帮助和指导下,我能够弄清楚目前需要添加哪些内容才能使自定义绑定正常工作。

我的猜测是,在即将发布的运行时中,这种情况会随着时间的推移而改变,但谁知道呢。。。

首先,添加一个小的扩展方法,将扩展添加到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

最新更新