当前位置: 首页 > 知识库问答 >
问题:

Azure 函数中的自定义绑定未得到解决

司徒运锋
2023-03-14

我正在尝试为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一起使用,因此我在所有项目中都以NetStandard ard2为目标。

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

[3-1-2019 08:48:02]加载了绑定扩展名“SampleExtensions”,该扩展名来自“被:方法=”FunctionApp.WriterFunction引用。运行'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; }
}

从我在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”。运行

[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”。运行“”索引失败,将被禁用。

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

现在,此消息在WebJobs场景中是有意义的,但对于Azure Function,您没有地方在启动代码中设置某些内容。调用函数会抛出以下消息

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

[3-1-2019 08:53:13]Microsoft.Azure.WebJobs。主机:“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个答案

毋宸
2023-03-14

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

我的猜测是,在即将发布的运行时版本中,这将随着时间的推移而改变,但谁知道呢?

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

接下来是IWebJobStartup实现。这将在启动时通过反射被运行时拾取。

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

您不能忘记的一件事是将以下内容添加到此类中:

[assembly: WebJobsStartup(typeof(MySimpleBindingStartup))]

你很快就会注意到这一点,因为如果你忘记了,装订就不会被拾起。

希望这能帮助所有遇到我同样问题的人。如果您想查看完整的代码,我在GitHub存储库中提供了一个示例项目:https://github.com/Jandev/CustomBindings

 类似资料:
  • 希望一些比我更了解Azure功能的人能提供帮助。 开箱即用,您可以使用应用程序设置中的APPINSIGHTS_INSTRUMENTATIONKEY设置登录到应用程序Insights...这将在基本级别记录函数请求,然后允许您执行等操作。 这只是被跟踪器或ilogger所掩盖。

  • 我做了这个自定义函数,并把它放在全局之外,这通常会工作。我也试着在主异步木偶函数中移动它,但也不起作用。这是一个简单的函数。在每个page evaluate函数中,我调用它并传递选择器。但是,它的说法没有定义和promise拒绝,这是奇怪的,因为函数不是promise....请帮助 我尝试将函数转换为异步函数,添加了一个新的参数页。然后,我将async添加到我的评估函数中,然后将puppeteer

  • Message Message,string lockToken,MessageReceiver,MessageReceiver,ILogger日志) 使用MessageReceiver或底层接口时,我会得到以下错误: Microsoft.Azure.WebJobs.Host:无法将参数“Message Receiver”绑定到类型“Microsoft.ServiceBus.Messaging.M

  • 我从loca.settings.json的值移到了Azure密钥库。我添加了Azure密钥库作为连接服务。 我在绑定部分时有问题。 我有课

  • 自定义绑定(Custom Binding)允许我们通过代码实现自定义绑定规则,从而完成更高级的业务需求。 示例代码 //.js片段 justep.Bind.bindingHandlers.yourBindingName = { init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {

  • 我制作了一个Azure函数(http触发器),并使用Visual Studio 2019将其部署在门户中。 该函数工作正常,我现在将添加一个绑定到我的CosmosDB。我导航到我的函数,然后单击“集成”。现在我看到了触发器、函数以及输入和输出绑定。 我应该可以在这里添加一个新的输入绑定。但我没有“添加”按钮。我做错了什么?