为什么 Azure Function 应用程序中使用的 Microsoft.Azure.WebJobs.HttpTriggerAttribute 是参数属性而不是方法属性?

5
我有一个Azure Functions应用程序。
我很惊讶地发现,在定义Azure WebJob函数时,HttpTriggerAttribute不必应用于HttpRequest参数。
因此,虽然这是有效的,并且与大多数教程和示例相匹配,
[FunctionName("get")]
public async Task<IActionResult> Get(
      [HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Get), Route = "api/get")]HttpRequest httpRequest)

这也是有效的。

[FunctionName("post")]
public async Task<IActionResult> Post(
      [HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Post), Route = "api/post")]MyType body)

由于该属性与HttpRequest参数没有关联,所以我很惊讶这个属性是一个参数属性而不是像方法属性一样的方法属性。

[FunctionName("post")]
[HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Post), Route = "api/post")]
public async Task<IActionResult> Post(MyType body)

为什么HttpTriggerAttribute作为参数属性而不是像FunctionNameAttribute一样作为方法属性实现?
1个回答

3
对于C#类库开发,FunctionName充当标记,将方法标记为函数入口点。它不涉及函数的输入。然而,触发器属性是不同的。它不仅具有标记Function类型的功能,还具有绑定输入数据到方法参数的作用。在处理该方法时需要这些数据。您可以将触发器属性视为'direction in'类型的绑定。这种类型的绑定需要作为C#类库开发方法的参数输入。类型为“direction out”的绑定定义为输出并在函数外部进行。其特点是如下所述。
标准C#类库函数的示例:https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-example#class-library-example

谢谢@BowmanZhu。看到这是一种惯例很有帮助。但我想了解为什么会存在这种惯例。从您的回答中我理解的解释是,这是一个参数属性,因为我们要绑定到一个参数。但当我们看到我们可以绑定到多个参数时,这种推理似乎(对我来说)不太好。例如:public async Task<IActionResult> Post([HttpTrigger(...)]MyType body, HttpRequest httpRequest)将绑定bodyhttpRequest参数。但是该属性仅应用于body参数。 - Zach
@Zach 我对触发器属性和参数之间的关系的理解来自于以下链接: https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#methods-recognized-as-functions 在这个文档中,它说“将输入数据绑定到方法参数”。 正如你所说,函数只需要绑定到任何参数声明即可。你可以把它理解为一种约定。你可以使用触发器属性任意绑定任何参数,并且你只能设置一个带有触发器属性的参数声明。 - Cindy Pau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接