Parse and modify a query string in .NET Core Parse and modify a query string in .NET Core asp.net asp.net

Parse and modify a query string in .NET Core


If you are using ASP.NET Core 1 or 2, you can do this with Microsoft.AspNetCore.WebUtilities.QueryHelpers in the Microsoft.AspNetCore.WebUtilities package.

If you are using ASP.NET Core 3.0 or greater, WebUtilities is now part of the ASP.NET SDK and does not require a separate nuget package reference.

To parse it into a dictionary:

var uri = new Uri(context.RedirectUri);var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);

Note that unlike ParseQueryString in System.Web, this returns a dictionary of type IDictionary<string, string[]> in ASP.NET Core 1.x, or IDictionary<string, StringValues> in ASP.NET Core 2.x or greater, so the value is a collection of strings. This is how the dictionary handles multiple query string parameters with the same name.

If you want to add a parameter on to the query string, you can use another method on QueryHelpers:

var parametersToAdd = new System.Collections.Generic.Dictionary<string, string> { { "resource", "foo" } };var someUrl = "http://www.google.com";var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);

Using .net core 2.2 you can get the query string using

var request = HttpContext.Request;var query = request.Query;foreach (var item in query){   Debug.WriteLine(item) }

You will get a collection of key:value pairs - like this

[0] {[companyName, ]}[1] {[shop, ]}[2] {[breath, ]}[3] {[hand, ]}[4] {[eye, ]}[5] {[firstAid, ]}[6] {[eyeCleaner, ]}


The easiest and most intuitive way to take an absolute URI and manipulate it's query string using ASP.NET Core packages only, can be done in a few easy steps:

Install Packages

PM> Install-Package Microsoft.AspNetCore.WebUtilities
PM> Install-Package Microsoft.AspNetCore.Http.Extensions

Important Classes

Just to point them out, here are the two important classes we'll be using: QueryHelpers, StringValues, QueryBuilder.

The Code

// Raw URI including query string with multiple parametersvar rawurl = "https://bencull.com/some/path?key1=val1&key2=val2&key2=valdouble&key3=";// Parse URI, and grab everything except the query string.var uri = new Uri(rawurl);var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);// Grab just the query string partvar query = QueryHelpers.ParseQuery(uri.Query);// Convert the StringValues into a list of KeyValue Pairs to make it easier to manipulatevar items = query.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();// At this point you can remove items if you wantitems.RemoveAll(x => x.Key == "key3"); // Remove all values for keyitems.RemoveAll(x => x.Key == "key2" && x.Value == "val2"); // Remove specific value for key// Use the QueryBuilder to add in new items in a safe way (handles multiples and empty values)var qb = new QueryBuilder(items);qb.Add("nonce", "testingnonce");qb.Add("payerId", "pyr_");// Reconstruct the original URL with new query stringvar fullUri = baseUri + qb.ToQueryString();

To keep up to date with any changes, you can check out my blog post about this here: http://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/


HttpRequest has a Query property which exposes the parsed query string via the IReadableStringCollection interface:

/// <summary>/// Gets the query value collection parsed from owin.RequestQueryString./// </summary>/// <returns>The query value collection parsed from owin.RequestQueryString.</returns>public abstract IReadableStringCollection Query { get; }

This discussion on GitHub points to it as well.