HTTP 触发器 Azure 函数上支持的 Singleton scopeId 绑定
Supported bindings for Singleton scopeId on HTTP Trigger Azure Function
我不清楚 SingletonAttribute
的 scopeId
参数是如何工作的。当您将 scopeId
参数绑定到路由参数时,它是否特别适用于 HTTP Trigger Azure Functions?绑定如何工作?我可以绑定什么variables/values?
例如:
[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 请求将 return:“Hello world”。
但是 Singleton 属性是否会工作,使得对 'v1/hello' 的所有请求都将 运行 串行,而两个同时请求,一个请求 'v1/first',另一个请求 'v1/second' 会运行并行?
我从 中了解到,对于服务总线触发器,您可以直接绑定到 消息对象中的属性 。
the documentation 中还有一个队列触发器函数示例,其中 scopeId 绑定到 WorkItem 对象中的 属性。
目前还不清楚 HTTP 触发器函数支持什么。
你有两种方式在Azure函数中实现单例模式。
第一个:
您可以通过设置 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
或 maxConcurrentCalls
来做到这一点。
第二种:
创建一个完整的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 的绑定表达式与一般 input/output 绑定的行为相同。也就是说,来自触发器的任何绑定数据都可供参考。
对于 HttpTrigger,如果您绑定到 POCO 类型,则包括任何 POCO 成员,以及任何路由参数。
关于您的代码,SingletonMode.Listener
不是您想要的代码。如果您只是想序列化函数的单个调用,那么您应该使用默认模式,即 [Singleton(“{input}”)]
.
回答您的问题 – 是的,这将序列化 v1/hello 的所有调用,允许 v1/first 和 v1/second 并发到 运行。
我不清楚 SingletonAttribute
的 scopeId
参数是如何工作的。当您将 scopeId
参数绑定到路由参数时,它是否特别适用于 HTTP Trigger Azure Functions?绑定如何工作?我可以绑定什么variables/values?
例如:
[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 请求将 return:“Hello world”。
但是 Singleton 属性是否会工作,使得对 'v1/hello' 的所有请求都将 运行 串行,而两个同时请求,一个请求 'v1/first',另一个请求 'v1/second' 会运行并行?
我从
the documentation 中还有一个队列触发器函数示例,其中 scopeId 绑定到 WorkItem 对象中的 属性。
目前还不清楚 HTTP 触发器函数支持什么。
你有两种方式在Azure函数中实现单例模式。
第一个:
您可以通过设置 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
或 maxConcurrentCalls
来做到这一点。
第二种:
创建一个完整的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 的绑定表达式与一般 input/output 绑定的行为相同。也就是说,来自触发器的任何绑定数据都可供参考。
对于 HttpTrigger,如果您绑定到 POCO 类型,则包括任何 POCO 成员,以及任何路由参数。
关于您的代码,SingletonMode.Listener
不是您想要的代码。如果您只是想序列化函数的单个调用,那么您应该使用默认模式,即 [Singleton(“{input}”)]
.
回答您的问题 – 是的,这将序列化 v1/hello 的所有调用,允许 v1/first 和 v1/second 并发到 运行。