Альтернатива HttpUtility.ParseQueryString без зависимости System.Web?

Я хочу иметь возможность создавать строки запроса URL, просто добавляя ключ и значение к некоторому вспомогательному классу и возвращаю его как URL-запрос. Я знаю, что это можно сделать, например:

var queryBuilder= HttpUtility.ParseQueryString("http://baseurl.com/?");
queryBuilder.Add("Key", "Value");
string url =  queryBuilder.ToString();

Это именно то поведение, которое я испытываю. Тем не менее, этот класс существует в личном большом System.Web, и я бы предпочел не приводить эту библиотеку для этого. Есть ли альтернатива где-нибудь?

Ответ 1

HttpValueCollection, который вы используете в своем примере, на самом деле не является тривиальным, и использует множество других частей библиотеки System.Web для кодирования действительного URL-адреса http для вас. Вы можете извлечь источник для частей, которые вам нужны, но, скорее всего, они будут каскадом в несколько больше, чем вы думаете!

Если вы это понимаете и просто хотите что-то примитивное, потому что вы уже убедитесь, что ключи и значения закодированы правильно, проще всего просто свернуть свои собственные.

Вот пример, в виде метода расширения для NameValueCollection:

public static class QueryExtensions
{
    public static string ToQueryString(this NameValueCollection nvc)
    {
        IEnumerable<string> segments = from key in nvc.AllKeys
                                       from value in nvc.GetValues(key)
                                       select string.Format("{0}={1}", 
                                       WebUtility.UrlEncode(key),
                                       WebUtility.UrlEncode(value));
        return "?" + string.Join("&", segments);
    }
}

Вы можете использовать это расширение для построения строки запроса следующим образом:

// Initialise the collection with values.
var values = new NameValueCollection {{"Key1", "Value1"}, {"Key2", "Value2"}};

// Or use the Add method, if you prefer.
values.Add("Key3", "Value3");

// Build a Uri using the extension method.
var url = new Uri("http://baseurl.com/" + values.ToQueryString());