无法从HttpRequestData中获取查询参数

27

我正在将我的代码从.NET 3.0升级到.NET 5.0,这会改变语法方式。

在之前的代码中,这是一个在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"];
}

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

在.NET 5.0中,我正在使用

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

有什么提示吗?


你是否在寻找Request.QueryString("fullname")?(链接中的方括号可能无法正确显示)。Intellisense可以显示所有成员,一定要使用它! - Olivier Jacot-Descombes
它不会工作,因为我正在使用 Microsoft.Azure.Functions.Worker.Http; 用于 .NET 5.0,这仅适用于 .NET -4.8。对于 .NET 5.0,我应该使用 HttpRequestData。 - Christopher Martinez
你看过该类的文档了吗?里面有关于URL或参数的信息吗? - mason
https://stackoverflow.com/a/67969169/1672994 可以回答您的问题。在 .net 5 中,您应该使用 Microsoft.AspNetCore.WebUtilities.QueryHelpers 包来获取和解析查询参数。 - user1672994
你难道不喜欢微软无缘无故地删除功能吗? - Nick
5个回答

26

有一个系统包可以提供相同的结果。很可能这就是为令它被移除的原因。只需使用:

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

这将产生与req.Query["array_var"]相同的结果。

享受


19
在 Azure function .NET 5.0 中,我们在 Http 触发器中使用 HttpRequestData。该类不包含 Query 参数。如需更多详细信息,请参阅 此处 enter image description here 因此,如果您想获取查询字符串,可以像@user1672994所说使用Microsoft.AspNetCore.WebUtilities.QueryHelpers来实现它。
例如:
var queryDictionary = 
    Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(req.Url.Query);
var result = queryDictionary["<key name>"];

9
我认为安装额外的ASP.NET Core包是多余的。可以直接使用以下代码:System.Web.HttpUtility.ParseQueryString(req.Url.Query);,然后使用var result = queryDictionary["<key name>"];获取结果。 - sntnupl

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

    }

你的回答与隔离进程函数无关。在那里HttpRequest不可用。 - Stephan
1
@Stephan 是的,我在复制问题中相同的代码时犯了一个错误。谢谢你指出来。我已经纠正了答案,但是我处理查询参数的方式仍然相同,并且适用于隔离函数。 - Rishanthakumar

6
如果您正在使用.NET 5.0的Azure Functions(隔离模式),您可以像这样从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

Debugger


-3

这对我很有效。简单明了。有一种方法可以将查询参数转换为字典。

var qp = req.GetQueryParameterDictionary();

var foobar = req["foobar"]; 

似乎在运行隔离模式的 .NET 5 中,这个功能不可用。 - Stephan
这个问题是关于隔离进程的。你可能需要考虑删除你的回答。 - David Yates

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