gpt4 book ai didi

c# - 如何使用 Azure Function HTTP 绑定(bind)执行 REST API 可选字符串 URI 参数?

转载 作者:太空宇宙 更新时间:2023-11-03 22:59:39 26 4
gpt4 key购买 nike

我花了一天时间在这上面,我真的认为这会是一件微不足道的事情。

围绕 HTTP 绑定(bind)“Route”参数、相关“Run”方法签名以及底层 Web API 路由机制文档,大约有十几个选项。我已经尝试了每一种,并且每一种似乎都会引发不同的错误。顺便说一句,这种反复试验特别令人沮丧且耗时。

Azure 函数绑定(bind)

https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook

ASP.NET 路由约束文档

https://learn.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#constraints

函数绑定(bind)允许您在每个函数配置文件中定义“路由”字符串,该文件定义该函数的入口点。它的有效工作方式与 ASP.NET 中的“Route”注释的工作方式相同(这对我来说是新的)。因此,Azure Function 文档链接到约束文档以供高级使用。

我们的用例并不高级,我们希望我们的函数像下面这样工作:

处理类似以下路线的内容:

"route" : "/books/{bookName}"

它映射到一个带有 Run() 签名的函数,如下所示:

Run(HttpRequestMessage req, string bookName, TraceWriter log)

如果没有 bookName,我们的函数将返回所有书籍的数组。如果有书名,它将返回该书的详细信息。标准 API 的东西。

根据“约束”文档,我们必须对 bookName 进行调整,使其成为可选的 URI 参数,并且我们有几个选项。以下是提供的两个示例/选项:

public class BooksController : ApiController
{
[Route("api/books/locale/{lcid:int?}")]
public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
}

public class BooksController : ApiController
{
[Route("api/books/locale/{lcid:int=1033}")]
public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }
}

目前,上述两个选项都不适用于函数。绑定(bind)不允许 function.json 中使用等号,并且 Run() 方法中的任何可选参数都需要是“最后”参数,并且我们无法控制 Run() 的顺序参数。即使我们可以更改它们,我们也不想这样做,因为将 TraceWriter log 作为最后一个参数是我们希望遵循的明智约定。

现在,Azure Functions 文档提供了一个可选参数示例,该示例似乎非常简单,但以某种方式设法避开了上面的特定用例。

这是来自 function.json 的路由:

"route": "products/{category:alpha}/{id:int?}"

这是方法签名:

Run(HttpRequestMessage request, string category, int? id, TraceWriter log)

所以,这里的区别在于,它们标记为可选的参数具体是一个 int,它是一个可以为 null 的类型。如果 URL 不包含 null int,azure 函数运行时显然会传递 null int,从而绕过将“id”作为方法的可选参数的要求。

如果您对字符串参数尝试相同的技巧,您会得到以下结果:

error CS0453: The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable'

是否有合理的解决方案来在 Azure Functions 中实现可选字符串参数?

如果是这样,请提供有关教程的提示。如果没有,请在教程中明确指出此限制。

最佳答案

这适用于像 int? 这样的结构,但不适用于像 string 这样的类。我在这里提交了一个问题:https://github.com/Azure/azure-webjobs-sdk-extensions/issues/224 .

在这个问题得到解决之前,您最好的选择可能是使用路由模板,例如:"route": "books/{bookName?}",但使用bookName 作为函数中的参数:Run(HttpRequestMessage req, TraceWriter log)

在我的简短测试中,这将为您提供正确的路由匹配,但您必须自己对 req 参数进行一些 URI 解析才能检查书名。

更新:此问题已得到修复,现在应该可以按预期工作。

关于c# - 如何使用 Azure Function HTTP 绑定(bind)执行 REST API 可选字符串 URI 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43748806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com