我有一个 .NET Core 6.0 Azure Function HTTP 触发器。
我希望以这两种常见形式处理数组查询字符串参数:
?param=foo¶m=escape%2Ctest?param=foo,escape%2Ctest在这两种情况下我都想提取数组["foo", "escape,test"]。
我惊讶地发现我可用的查询字符串解析选项要么不支持逗号语法,要么不支持将查询字符串作为参数分组的一部分进行 URL 解码。
我尝试过使用几种不同的 dotnet API:
System.Web.HttpUtility.ParseQueryStringMicrosoft.AspNetCore.WebUtilities.QueryHelpers.ParseQueryMicrosoft.AspNetCore.Http.HttpRequest.Queryvar qs = "?param=foo,escape%2Ctest";
var a = httpRequest.Query["param"];
// ["foo,escape,test"]
var b = HttpUtility.ParseQueryString(qs)["param"];
// "foo,escape,test"
var c = QueryHelpers.ParseQuery(qs)["param"];
// ["foo,escape,test"]
Run Code Online (Sandbox Code Playgroud)
我有点惊讶的是不支持逗号分隔格式。我感到非常惊讶的是,似乎没有一种方法可以在不解码查询字符串参数的情况下获取分段查询字符串(这会阻止区分 和param=foo,escape%2Ctest)?param=foo,escape,test。
我将在下面将我当前的解决方案作为“答案”发布,但我希望我缺少一个使用 .NET 库的更简单的解决方案。如果有人能指出我在这里错过了什么,我将不胜感激。
我有一个 Azure Functions 应用程序。
我很惊讶地发现,在定义 Azure WebJob 函数时,HttpTriggerAttribute 不必应用于 HttpRequest 参数。
因此,虽然这是有效的,并且与大多数教程和示例相匹配,
[FunctionName("get")]
public async Task<IActionResult> Get(
[HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Get), Route = "api/get")]HttpRequest httpRequest)
Run Code Online (Sandbox Code Playgroud)
这也是有效的,
[FunctionName("post")]
public async Task<IActionResult> Post(
[HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Post), Route = "api/post")]MyType body)
Run Code Online (Sandbox Code Playgroud)
由于该属性未绑定到 HttpRequest 参数,因此我很惊讶该属性是参数属性而不是方法属性,例如,
[FunctionName("post")]
[HttpTrigger(AuthorizationLevel.Anonymous, nameof(HttpMethods.Post), Route = "api/post")]
public async Task<IActionResult> Post(MyType body)
Run Code Online (Sandbox Code Playgroud)
为什么 HttpTriggerAttribute 被实现为参数属性而不是像 FunctionNameAttribute 这样的方法属性?