c# - Azure 函数中的自定义绑定未得到解决
问题描述
我正在尝试为 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 绑定扩展示例项目。该项目基于 .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、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 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:无法从 Azure WebJobs SDK 调用“CustomBindingFunction”。是否缺少 Azure WebJobs SDK 属性?
我已经阅读了一些关于添加extensions.json
文件并使用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" />
解决方案
在其他示例的一些帮助和指导下,我能够弄清楚目前需要添加什么才能使您的自定义绑定正常工作。
我的猜测是,在即将发布的运行时版本中,这会随着时间的推移而改变,但谁知道......
首先,添加一个小的扩展方法,您可以在其中将扩展添加到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
推荐阅读
- c# - ASP.NET MVC 应用程序无法验证从 Azure AD 收到的令牌
- php - laravel 嵌套的急切加载和第一个函数
- python - 将标签悬停在图表上时显示标签*具有高 y 轴值*、多条线和多轴
- git - 当前分支没有跟踪信息。请指定您要合并的分支
- javascript - 如何将日期时间字符串分成两部分
- telegram-bot - 隐私设置为禁用的电报机器人应该能够读取组中的最后 100 条消息 - 如何在我的机器人中实现这一点?
- flutter - 颤动的firebaseauth异常问题
- visual-studio-code - 如何通过 VS Code 在 Azure DevOps YAML 文件中添加和验证自定义构建任务
- google-sheets - 如何计算当前行及以上行中的值的数量
- javascript - div 样式的第一个元素不起作用