С# Url Builder Класс

Я часто заканчиваю свой собственный метод обертки/расширения для/вокруг System.Uri и задавался вопросом, знает ли кто-нибудь о хорошей реализации с открытым исходным кодом. Что мне больше всего нравится, так это параметрирование параметров запроса, создание новой строки запроса (это ключ) и замена имен страниц. Есть хорошие, или System.Uri достаточно для вас?

Ответы

Ответ 1

BradVin QueryString Builder класс хорош. Свободный интерфейс и поддержка шифрования.

Также стоит проверить этот класс UrlBuilder в CodeProject. Как и System.UriBuilder, лучше поддерживать работу с QueryString.

Ответ 2

Flurl [раскрытие: Я автор] - это свободно создатель URL, который выглядит так:

var url = "http://www.some-api.com"
    .AppendPathSegment("endpoint")
    .SetQueryParams(new {
        api_key = ConfigurationManager.AppSettings["SomeApiKey"],
        max_results = 20,
        q = "Don't worry, I'll get encoded!"
    });

Если вы создаете URL-адреса с целью их вызова, Flurl.Http является сопутствующей библиотекой, которая позволяет вам выполнять HTTP с Свободная цепь:

await "https://api.mysite.com"
    .AppendPathSegment("person")
    .SetQueryParams(new { ap_key = "my-key" })
    .WithOAuthBearerToken("MyToken")
    .PostJsonAsync(new { first_name = firstName, last_name = lastName });

Получить полный пакет на NuGet:

PM> Install-Package Flurl.Http

или просто автономный построитель URL:

PM> Install-Package Flurl

Ответ 3

Мы используем собственный альтернативный класс Uri, который, как вы говорите, частично основан на Uri. Тем не менее, я думаю, что существует важное различие - System.Uri, как правило, призвана быть неизменной - или, точнее, вести себя неизменно. Как только кто-то появляется, он представляет собой точное универсальное местоположение/конечная точка ресурса. Если вам нужно описать другое местоположение, вы должны создать новый Uri, но не изменить существующий.

Существует отдельный класс, который специализируется на выпуске Uri's: UriBuilder.

Ответ 4

Между System.Uri и System.UriBuilder, какие функции вы точно не видите из этих двух?

Ответ 5

    /// <summary>
    /// The arguments must be like: varName1, varValue1, varName2, varValue2 and so on.
    /// Empty names will be not be added to the result.
    /// Returns a string of the form varName1=varValue1&varName2=varValue2...
    /// </summary>    
    public static string BuildQueryString(params string[] strings)
    {
        Debug.Assert(0 == strings.GetLength(0) % 2);

        StringBuilder builder = new StringBuilder(50);
        bool isName = true;
        bool isEmptyName = false;

        foreach (string crtString in strings)
        {
            isEmptyName = (isName && string.IsNullOrEmpty(crtString)) ||
                (!isName && isEmptyName);

            if (!isEmptyName)
            {
                builder.Append(HttpUtility.UrlEncode(crtString));

                if (isName)
                    builder.Append("=");
                else
                    builder.Append("&");
            }

            isName = !isName;
        }

        return builder.ToString();
    }

Ответ 6

В CodePlex есть очень красивый новый проект с открытым исходным кодом, который позволяет читать, писать, шифровать Uris и немного больше. Проверьте их!

http://querystrings.codeplex.com

Ответ 7

Я не уверен точно, что вы пытаетесь сделать (примеры помогут), но похоже, что вы пытаетесь получить некоторые функции Apache mod_rewrite в ASP.NET.

Существует статья в MSDN об этом.