26

I'm upgrading my code from .NET 3.0 to .NET 5.0, this changes the sintaxis quite a bit. In my previous code, which is a http request build in AZURE FUNCTIONS .NET 5.0 isolate, builds an GET api that takes parameters.

This is my previous code from .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"];
}

I just cant find a way to use req to grab a parameter from the api call like it was done on .NET 3.0 string i = req.Query["i"];

In .NET 5.0 im using

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

Any hint?

  • Are you looking for [Request.QueryString("fullname")](https://learn.microsoft.com/en-us/dotnet/api/system.web.httprequest.querystring?view=netframework-4.8)? (can't get't the square brackets right in the link). Intellisense reveals all the members. Use it! – Olivier Jacot-Descombes Jun 22 '21 at 17:13
  • It wont work since im using Microsoft.Azure.Functions.Worker.Http; for .NET 5.0, this only works for .NET -4.8. For .NET 5.0 i suppose to be using HttpRequestData – Christopher Martinez Jun 22 '21 at 17:23
  • Did you look at [the documentation for that class](https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.functions.worker.http.httprequestdata?view=azure-dotnet)? Did that contain any information about the URL or the parameters? – mason Jun 22 '21 at 17:40
  • https://stackoverflow.com/a/67969169/1672994 will answer your query. You should be using Microsoft.AspNetCore.WebUtilities.QueryHelpers package in .net 5 to get and parse query parameters. – user1672994 Jun 22 '21 at 17:44
  • Don't you just love it when MS removes functionality for no reason! – Nick Feb 28 '23 at 09:37

5 Answers5

24

There is a system package that gives the same result. That is probably why it was removed. Just use:

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

This gives the same result as req.Query["array_var"];

Enjoy

Sven
  • 420
  • 3
  • 10
18

In Azure function .NET 5.0, we use the HttpRequestData in Http Trigger. The class does not contain Query parameter. For more details, please refer to here enter image description here

So if you want to get query string, you can use the package Microsoft.AspNetCore.WebUtilities.QueryHelpers to implement it as @user1672994 said.

For example

var queryDictionary = 
    Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(req.Url.Query);
var result = queryDictionary["<key name>"];
cyberconte
  • 2,371
  • 4
  • 21
  • 27
Jim Xu
  • 21,610
  • 2
  • 19
  • 39
  • 9
    I think installing the additional ASP.NET Core package is redundant. One can simply use the following: `System.Web.HttpUtility.ParseQueryString(req.Url.Query);`, followed by `var result = queryDictionary[""]; ` – sntnupl Feb 24 '22 at 11:19
14

You can just add the the query parameter name to the function parameter list as follows and access the value:

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

    }
Rishanthakumar
  • 871
  • 10
  • 20
  • Your answer isn't about the isolated process functions. The `HttpRequest` isn't available there. – Stephan Apr 28 '22 at 10:42
  • 1
    @Stephan yes I made a mistake by copying the same code as in question. Thanks for pointing out. I have corrected the answer but still how I handled the query parameter is same and its applicate for isolated functions. – Rishanthakumar May 12 '22 at 10:09
6

If you are using Azure Functions (isolated) with .NET 5.0 - you can get it out of FunctionContext.BindingContext.BindingData like this:

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

As the question asked about the HttpRequestData. The FunctionContext is also available in it. So you can achieve the same results (with more steps) like this:

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
}

This also works with the parameter in both query and path. As you can see both parameters in the API path below is in the BindingData

/api/weather/12?range=today

Debugger

phwt
  • 1,356
  • 1
  • 22
  • 42
-3

This works for me. Nice and simple. There is a method to get the query params into a dictionary.

var qp = req.GetQueryParameterDictionary();

var foobar = req["foobar"]; 
Suhaib Janjua
  • 3,538
  • 16
  • 59
  • 73