簡體   English   中英

無法從 HttpRequestData 獲取查詢參數

[英]Can't get query parameter from HttpRequestData

我正在將我的代碼從 .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"];
}

我只是找不到一種方法來使用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 函數 .NET 5.0 中,我們在 Http Trigger 中使用HttpRequestData 該類不包含Query參數。 更多詳情,請參考這里在此處輸入圖像描述

因此,如果您想獲取查詢字符串,可以使用包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"]; 相同的結果。

享受😉

如果您在 .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

調試器

這對我有用。 很好很簡單。 有一種方法可以將查詢參數放入字典中。

var qp = req.GetQueryParameterDictionary();

var foobar = req["foobar"]; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM