我正在尝试为Azure Functions创建自己的自定义绑定。 这项工作基于有关此功能的2篇Wiki文章: https://github.com/Azure/azure-webjobs-sdk/wiki/Creating-custom-input-and-output-bindings 和 https://github.com/Azure/WebJobsExtensionSamples
对于示例项目,我指的是Azure Functions/WebJobs binding extension sample project。 该项目基于.NET Framework 4.6。
我希望我自己的自定义绑定能够与Azure Functions v2一起使用,因此我在所有项目中都将NetStandard2作为目标。
在示例项目中,我看到启动本地仿真器时正在加载绑定扩展。
[3-1-2019 08:48:02]从“引用者:Method ='FunctionApp.WriterFunction.Run',Parameter ='sampleOutput'中加载绑定扩展'SampleExtensions'。
但是,运行自己的绑定扩展程序时,我从未看到此行出现。
我要做的是以下几点。 首先,我创建了一个新属性。
[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; }
}
从我在Wiki上阅读的内容来看,我认为这足以在我的Azure Functions项目中使用它。 函数看起来像这样。
[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。确保绑定支持参数类型。如果您使用绑定扩展(例如Azure存储,ServiceBus,Timer等),请确保已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus( ),builder.AddTimers()等)。
[3-1-2019 08:51:37]函数'CustomBindingFunction.Run'的索引编制失败,将被禁用。
[3-1-2019 08:51:37]找不到作业功能。尝试公开您的工作类别和方法。如果您使用绑定扩展(例如Azure存储,ServiceBus,Timer等),请确保已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus( ),builder.AddTimers()等)。
现在,此消息在WebJob场景中有意义,但是对于Azure功能,您没有地方在启动代码中进行设置。 调用该函数将引发以下消息。
[3-1-2019 08:53:13]发生未处理的主机错误。
[3-1-2019 08:53:13] Microsoft.Azure.WebJobs.Host:不能从Azure WebJobs SDK调用'CustomBindingFunction'。是否缺少Azure WebJobs SDK属性?。
我已经阅读了有关添加extensions.json
file and use the AzureWebJobs_ExtensionsPath
(for 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" />
答案 0 :(得分:5)
在其他示例的帮助和指导下,我能够弄清楚当前需要添加哪些内容才能使自定义绑定生效。
我的猜测是,随着时间的流逝,这种情况将随着时间的流逝而改变,但是谁知道...
首先,添加一个小的扩展方法,将扩展名添加到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