无法从 HttpRequestData 获取查询参数

Chr*_*nez 27 c# azure-functions .net-5

我正在将代码从 .NET 3.0 升级到 .NET 5.0,这对 sintaxis 做了很大的改变。在我之前的代码中,这是在 AZURE FUNCTIONS .NET 5.0 隔离中构建的 http 请求,构建了一个采用参数的 GET api。

这是我之前来自 .NET 3.0 的代码

using Microsoft.Azure.WebJobs; 
using Microsoft.Azure.WebJobs.Extensions.Http;


public static async Task<IActionResult> Run(
  [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
  ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    byte[] RSA_Key_to_Correct = new byte[0x80];
    string array_var = req.Query["array_var"];
    string i = req.Query["i"];
    string incrementing_value = req.Query["incrementing_value"];
}
Run Code Online (Sandbox Code Playgroud)

我只是找不到一种方法来使用req从 api 调用中获取参数,就像在 .NET 3.0 上完成的那样string i = req.Query["i"];

在 .NET 5.0 中,我使用

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
Run Code Online (Sandbox Code Playgroud)

有什么提示吗?

Sve*_*ven 27

有一个系统包可以给出相同的结果。这可能就是它被删除的原因。只需使用:

var query = System.Web.HttpUtility.ParseQueryString(req.Url.Query);
var from = query["key"]
Run Code Online (Sandbox Code Playgroud)

这给出了与 req.Query["array_var"]; 相同的结果

享受


Jim*_* Xu 19

在Azure函数.NET 5.0中,我们使用HttpRequestDataHttp触发器。该类不包含Query参数。欲了解更多详情,请参阅此处 在此输入图像描述

所以如果你想获取查询字符串,你可以使用该包Microsoft.AspNetCore.WebUtilities.QueryHelpers来实现它,如@user1672994所说。

例如

var queryDictionary = 
    Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(req.Url.Query);
var result = queryDictionary["<key name>"];
Run Code Online (Sandbox Code Playgroud)

  • 我认为安装额外的 ASP.NET Core 包是多余的。人们可以简单地使用以下内容:`System.Web.HttpUtility.ParseQueryString(req.Url.Query);`,后跟`var result = queryDictionary["&lt;key name&gt;"]; ` (9认同)

Ris*_*mar 15

您只需将查询参数名称添加到函数参数列表中即可,如下所示并访问值:

public static async Task<HttpResponseData> Run(
      [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequestData req, 
      FunctionContext executionContext, string parameter1)
    {
        var log = executionContext.GetLogger("TestParam");
        log.LogInformation("C# HTTP trigger function processed a request.");
        log.LogInformation($"Parameter Value: {parameter1}");

    }
Run Code Online (Sandbox Code Playgroud)


phw*_*hwt 6

FunctionContext.BindingContext.BindingData如果您将 Azure Functions(隔离)与 .NET 5.0 一起使用 - 您可以像这样获取它:

functionContext.BindingContext
               .BindingData["weatherForecastId"]
               .ToString();
Run Code Online (Sandbox Code Playgroud)
[Function("WeatherForecastGet")]
public async Task<HttpResponseData> Get([HttpTrigger(AuthorizationLevel.Function, "get", Route = "weather/{weatherForecastId:required}")] HttpRequestData req,
                                        FunctionContext executionContext)
{
    string weatherForecastId = executionContext.BindingContext
                                               .BindingData["weatherForecastId"]
                                               .ToString();

    var result = this.doSomething(weatherForecastId);
    
    var response = req.CreateResponse(HttpStatusCode.OK);
    await response.WriteAsJsonAsync(result);

    return response;
}
Run Code Online (Sandbox Code Playgroud)

正如问题所询问的那样HttpRequestData。里面FunctionContext也有。因此,您可以获得相同的结果(需要更多步骤),如下所示:

httpRequestData.FunctionContext
               .BindingContext
               .BindingData["weatherForecastId"]
               .ToString();
Run Code Online (Sandbox Code Playgroud)
[Function("WeatherForecastGet")]
public async Task<HttpResponseData> Get([HttpTrigger(AuthorizationLevel.Function, "get", Route = "weather/{weatherForecastId:required}")] HttpRequestData req,
                                        FunctionContext executionContext)
{
    string weatherForecastId = req.FunctionContext
                                  .BindingContext
                                  .BindingData["weatherForecastId"]
                                  .ToString();

    // some logic
}
Run Code Online (Sandbox Code Playgroud)

这也适用于查询和路径中的参数。正如您所看到的,下面的 API 路径中的两个参数都位于BindingData

/api/weather/12?range=today
Run Code Online (Sandbox Code Playgroud)

调试器