UrlEncode через консольное приложение?

Обычно я бы просто использовал:

HttpContext.Current.Server.UrlEncode("url");

Но поскольку это консольное приложение, HttpContext.Current всегда будет null .

Есть ли другой метод, который делает то же самое, что я мог бы использовать?

Ответов (12)

Решение

Попробуй это!

Uri.EscapeUriString(url);

Или

Uri.EscapeDataString(data)

Нет необходимости ссылаться на System.Web.

Изменить: см. Еще один ответ SO для получения дополнительной информации ...

HttpUtility.UrlEncode ("url") в System.Web.

Лучше всего добавить ссылку на System.web..dll

и используйте var EncodedUrl = System.Web.HttpUtility.UrlEncode ("URL_TEXT");

Вы можете найти файл в System.web.dll

Использовать WebUtility.UrlEncode(string) из System.Net пространства имен

Попробуйте использовать метод UrlEncode в классе HttpUtility.

  1. http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx

Вы захотите использовать

System.Web.HttpUtility.urlencode("url")

Убедитесь, что у вас есть system.web в качестве одной из ссылок в вашем проекте. Я не думаю, что он по умолчанию включен в консольные приложения в качестве справочника.

Я не парень .NET, но вы не можете использовать:

HttpUtility.UrlEncode Method (String)

Что описано здесь:

HttpUtility.UrlEncode Method (String) в MSDN

используйте статический метод HttpUtility.UrlEncode.

Я сам столкнулся с этой проблемой, и вместо того, чтобы добавлять сборку System.Web в свой проект, я написал класс для кодирования / декодирования URL-адресов (это довольно просто, и я провел некоторое тестирование, но не много). Я включил исходный код ниже. Пожалуйста: оставьте комментарий вверху, если вы повторно используете это, не обвиняйте меня, если он сломается, учитесь на коде.

''' <summary>
''' URL encoding class.  Note: use at your own risk.
''' Written by: Ian Hopkins (http://www.lucidhelix.com)
''' Date: 2008-Dec-23
''' </summary>
Public Class UrlHelper
    Public Shared Function Encode(ByVal str As String) As String
        Dim charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"))
        Dim pattern = String.Format("[^{0}]", charClass)
        Dim evaluator As New MatchEvaluator(AddressOf EncodeEvaluator)

        ' replace the encoded characters
        Return Regex.Replace(str, pattern, evaluator)
    End Function

    Private Shared Function EncodeEvaluator(ByVal match As Match) As String
    ' Replace the " "s with "+"s
        If (match.Value = " ") Then
            Return "+"
        End If
        Return String.Format("%{0:X2}", Convert.ToInt32(match.Value.Chars(0)))
    End Function

    Public Shared Function Decode(ByVal str As String) As String
        Dim evaluator As New MatchEvaluator(AddressOf DecodeEvaluator)

        ' Replace the "+"s with " "s
        str = str.Replace("+"c, " "c)

        ' Replace the encoded characters
        Return Regex.Replace(str, "%[0-9a-zA-Z][0-9a-zA-Z]", evaluator)
    End Function

    Private Shared Function DecodeEvaluator(ByVal match As Match) As String
        Return "" + Convert.ToChar(Integer.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber))
    End Function
End Class

Кибби предлагает настоящий ответ. Да, HttpUtility.UrlEncode - правильный метод, но он не будет доступен по умолчанию для консольного приложения. Вы должны добавить ссылку на System.Web. Для этого

  1. В проводнике решений щелкните правой кнопкой мыши ссылки
  2. Выберите "добавить ссылку"
  3. В диалоговом окне «Добавить ссылку» используйте вкладку .NET.
  4. Прокрутите вниз до System.Web, выберите его и нажмите ОК.

СЕЙЧАС вы можете использовать метод UrlEncode. Вы все равно захотите добавить,

используя System.Web

в верхней части консольного приложения или используйте полное пространство имен при вызове метода,

System.Web.HttpUtility.UrlEncode (someString)

Код Иэна Хопкинса помогает мне без добавления ссылки на System.Web. Вот порт на C# для тех, кто не использует VB.NET:

/// <summary>
/// URL encoding class.  Note: use at your own risk.
/// Written by: Ian Hopkins (http://www.lucidhelix.com)
/// Date: 2008-Dec-23
/// (Ported to C# by t3rse (http://www.t3rse.com))
/// </summary>
public class UrlHelper
{
    public static string Encode(string str) {
        var charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"));
        return Regex.Replace(str, 
            String.Format("[^{0}]", charClass),
            new MatchEvaluator(EncodeEvaluator));
    }

    public static string EncodeEvaluator(Match match)
    {
        return (match.Value == " ")?"+" : String.Format("%{0:X2}", Convert.ToInt32(match.Value[0]));
    }

    public static string DecodeEvaluator(Match match) {
        return Convert.ToChar(int.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber)).ToString();
    }

    public static string Decode(string str) 
    {
        return Regex.Replace(str.Replace('+', ' '), "%[0-9a-zA-Z][0-9a-zA-Z]", new MatchEvaluator(DecodeEvaluator));
    }
}

Uri.EscapeUriString не следует использовать для экранирования строки, передаваемой в URL-адресе, поскольку он не кодирует все символы, как вы могли ожидать. Знак "+" - хороший пример, от которого не ускользнуть. Затем это преобразуется в пробел в URL-адресе, поскольку это то, что он означает в простом URI. Очевидно, это вызывает серьезные проблемы в ту минуту, когда вы пытаетесь передать что-то вроде строки в кодировке base 64 в URL-адресе, и пробелы появляются по всей вашей строке на принимающей стороне.

Вы можете использовать HttpUtility.UrlEncode и добавить необходимые ссылки в свой проект (и если вы общаетесь с веб-приложением, я не вижу причин, по которым вам не следует этого делать).

В качестве альтернативы использовать Uri.EscapeDataString над Uri.EscapeUriString , как описано здесь очень хорошо: https://answacode.com/a/34189188/7391