UrlEncode через консольное приложение?
обычно я бы просто использовать:
HttpContext.Current.Server.UrlEncode("url");
но так как это консольное приложение, HttpContext.Current
всегда null
.
есть еще один метод, который делает то же самое, что я мог бы использовать?
12 ответов:
попробуйте это!
Uri.EscapeUriString(url);
или
Uri.EscapeDataString(data)
нет необходимости в системе отсчета.Сеть.
Edit: см. другое так отвечу...
Я не .NET парень, но, вы не можете использовать:
HttpUtility.UrlEncode Method (String)
, который описан здесь:
код от Яна Хопкинса делает трюк для меня без необходимости добавлять ссылку на систему.Сеть. Вот порт на 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)); } }
вы хотите использовать
System.Web.HttpUtility.urlencode("url")
убедитесь, что у вас есть система.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.Сеть. Чтобы сделать это,
- в обозревателе решений щелкните правой кнопкой мыши на ссылки
- выбрать "Добавить ссылку"
- в диалоговом окне "Добавить ссылку" используйте вкладку .NET
- прокрутите вниз до System.Web, Выберите это и нажмите ОК
теперь вы можете использовать метод UrlEncode. Вы все равно хотите добавить,
использование системы.Web
в верхней части консольного приложения или использовать полное пространство имен при вызове метода,
лучше всего добавить ссылку на System.сеть..dll
и использовать var EncodedUrl=система.Сеть.HttpUtility.UrlEncode ("URL_TEXT");
вы можете найти файл в
Uri.EscapeUriString не следует использовать для экранирования строки, передаваемой в URL, поскольку она не кодирует все символы, как можно было бы ожидать. "+"Является хорошим примером, который не ускользнул. Затем это преобразуется в пробел в URL-адресе, так как это то, что это означает в простом URI. Очевидно, что это вызывает массовые проблемы в ту минуту, когда вы пытаетесь передать что-то вроде кодированной строки base 64 в URL-адресе, и пробелы появляются по всей строке на приемном конце.
вы можете использовать HttpUtility.UrlEncode и добавить необходимые ссылки на ваш проект (и если вы общаетесь с веб-приложением, то я не вижу причин, почему вы не должны этого делать).
альтернативно используйте Uri.Сбежал из-за Ури.EscapeUriString как очень хорошо объяснил здесь:https://stackoverflow.com/a/34189188/7391