HTTP 触发器 Azure 函数上支持的 Singleton scopeId 绑定

问题描述

我不清楚 scopeIdSingletonAttribute 参数是如何工作的。具体来说,当您将 scopeId 参数绑定到路由参数时,它是否适用于 HTTP Trigger Azure Functions?绑定是如何工作的?我可以绑定到哪些变量/值?

例如:

[Singleton("{input}",Mode = SingletonMode.Listener)]
public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous,"post",Route = "v1/{input:length(1,30)}")] Microsoft.AspNetCore.Http.HttpRequest req,string input,ILogger log) {
    return new OkObjectResult(input + " world");
}

使用 URI 'v1/hello' 对此函数的 HTTP POST 请求将返回:“Hello world”。

但是,Singleton 属性是否会起作用,以便对“v1/hello”的所有请求都可以串行运行,而同时对“v1/first”和另一个对“v1/second”的两个请求可以并行运行?

>

我从 this answer 看到,对于服务总线触发器,您可以直接绑定到消息对象属性
同样在 the documentation 中有一个队列触发器函数的示例,其中 scopeId 绑定到 WorkItem 对象中的一个属性
目前尚不清楚 HTTP 触发器函数支持什么。

解决方法

在 Azure 函数中有两种实现单例模式的方法。

第一个:

您可以通过设置 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUTmaxConcurrentCalls 来实现。

Singleton Azure function running as separate instances

第二种:

创建一个完整的Function项目,类似于webapp,并在Configure中实现。

Use dependency injection in .NET Azure Functions

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHttpClient();

        builder.Services.AddSingleton<IMyService>((s) => {
            return new MyService();
        });

        builder.Services.AddSingleton<ILoggerProvider,MyLoggerProvider>();
    }
}
,

我在 GitHub 上收到了 Microsoft 的回复:https://github.com/MicrosoftDocs/azure-docs/issues/69011#issuecomment-771922910

Singleton 的绑定表达式与一般输入/输出绑定的行为相同。也就是说,来自触发器的任何绑定数据都可供参考。

在 HttpTrigger 的情况下,如果您绑定到 POCO 类型,则包括任何 POCO 成员以及任何路由参数。 关于您的代码,SingletonMode.Listener 不是您想要的。如果您只是想序列化函数的单个调用,那么您应该使用默认模式,即 [Singleton(“{input}”)]

回答您的问题 - 是的,这将序列化 v1/hello 的所有调用,从而允许 v1/first 和 v1/second 同时运行。”