无法从 HttpRequestData 获取查询参数

Can't get query parameter from HttpRequestData

我正在将我的代码从 .NET 3.0 升级到 .NET 5.0,这使 sintaxis 发生了很大变化。 在我之前的代码中,这是一个在 AZURE FUNCTIONS .NET 5.0 isolate 中构建的 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"];
}

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

我在 .NET 5.0 中使用

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

有什么提示吗?

在 Azure Function .NET 5.0 中,我们在 Http Trigger 中使用 HttpRequestData。 class 不包含 Query 参数。更多详情请参考here

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

例如

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

您可以如下将查询参数名称添加到函数参数列表并访问值:

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}");

    }

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

var query = System.Web.HttpUtility.ParseQueryString(req.Url.Query);
var from = query["key"]

这给出与 req.Query["array_var"];

相同的结果

尽情享受

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

functionContext.BindingContext
               .BindingData["weatherForecastId"]
               .ToString();
[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;
}

关于HttpRequestData的问题。 FunctionContext 也可用。所以你可以像这样获得相同的结果(更多的步骤):

httpRequestData.FunctionContext
               .BindingContext
               .BindingData["weatherForecastId"]
               .ToString();
[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
}

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

/api/weather/12?range=today

这对我有用。漂亮而简单。有一种方法可以将查询参数放入字典中。

var qp = req.GetQueryParameterDictionary();

var foobar = req["foobar"];