2008-08-18 10 views
58

Normalnie bym po prostu użyć:UrlEncode za pomocą aplikacji konsolowej?

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

Ale ponieważ jest to aplikacja konsoli HttpContext.Current zawsze będzie null.

Czy istnieje inna metoda, która robi to samo, co mogę użyć?

Odpowiedz

66

Wypróbuj!

Uri.EscapeUriString(url); 

Albo

Uri.EscapeDataString(data) 

Nie ma potrzeby odwoływać System.Web.

Edit: Proszę zobaczyć another SO odpowiedzieć na więcej ...

+0

Nie wiem, dlaczego został poddany pod głosowanie; może ta edycja coś naprawiła? W każdym razie jest to dobra odpowiedź. Aby uzyskać więcej informacji, zobacz [odpowiedź] (http://stackoverflow.com/a/8451941/530545) z innego podobnego pytania. – Granger

+0

Działa wspaniale i nie trzeba dodawać żadnych odwołań. –

+3

dziękuję za udzielenie odpowiedzi, a NIE za odpowiedź. – sonjz

72

Nie jestem facet .NET, ale nie można używać:

HttpUtility.UrlEncode Method (String) 

który jest opisany tutaj:

HttpUtility.UrlEncode Method (String) on MSDN

+3

Nie chcę padać na każdy parady, ale wspomniano HttpUtility.UrlEncode nie wydaje się być widoczne nawet kiedy włącz "using System.Web". Czy to faktycznie działa dla kogoś, a jeśli tak, to czy możesz podać rzeczywisty kod? –

+25

Potrzebujesz (musisz) dodać System.Web jako odniesienie. Po prostu umieszczenie przy użyciu System.Web nie wystarczy – Anjisan

+0

Wiedziałem o System.Web.HttpContext, ale nie było rozwiązania. Dziękuję Anjisanowi za wskazanie, że muszę dodać System.Web jako punkt odniesienia. +1 ode mnie! –

1

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

1

użyć statycznej metody HttpUtility.UrlEncode.

6

będziemy chcieli użyć

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

Upewnij się, że system.Web jako jedno z odwołań w projekcie. Nie sądzę, aby był on domyślnie uwzględniony jako odniesienie w aplikacjach konsolowych.

3

Sam wpadłem na ten problem i zamiast dodawać do mojego projektu zestaw System.Web, napisałem klasę do kodowania/dekodowania adresów URL (jest to bardzo proste, a ja zrobiłem kilka testów, ale nie wiele). Załączam kod źródłowy poniżej. Proszę: zostaw komentarz na górze, jeśli użyjesz tego ponownie, nie obwiniaj mnie, jeśli się złamie, ucz się z kodu.

''' <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 
+0

Wydaje się działać. Dzięki. – Echilon

+3

cofa ... zapisywanie własnego kodu, dzięki czemu można uniknąć odniesienia do standardowej biblioteki, która nie pisze zazwyczaj "Złych rzeczy". –

+0

Muszę się zgodzić z Justinem tutaj –

2

Kibbee oferuje prawdziwą odpowiedź. Tak, HttpUtility.UrlEncode jest właściwą metodą, ale domyślnie nie będzie dostępna dla aplikacji konsolowej. Musisz musi dodać odniesienie do System.Web. Aby to zrobić,

  1. W swojej Solution Explorer kliknij prawym przyciskiem myszy referencje
  2. Wybierz "Add Reference"
  3. W oknie dialogowym "Dodaj Reference", należy skorzystać z karty .NET
  4. Przewiń w dół do System.Web, wybierz to i uderz w ok.

TERAZ możesz użyć metody UrlEncode. Nadal będziesz chciał dodać,

użyciu System.Web

u góry aplikacji konsoli lub korzystać z pełnej nazw podczas wywoływania metody,

System.Web.HttpUtility.UrlEncode (someString)

13

Kod z Iana Hopkinsa robi dla mnie trik bez konieczności dodawania odniesienia do System.Web. Oto port do C# dla tych, którzy nie korzystają z 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)); 
    } 
} 
+1

Świetna robota zarówno t3rse, jak i Iana Hopkinsa. Wpadłem na ten problem budując aplikację wpf. wpf używa odchudzonego "profilu klienta" .net, podczas gdy moja biblioteka klas używa pełnej wersji. Tylko pełna wersja .net ma dostęp do System.Web, który zawiera HttpUtility.UrlEncode. – MrSharps

3

Korzystając WebUtility.UrlEncode(string) z System.Net nazw

+1

Warto wspomnieć, że ta metoda jest dostępna od .NET 4.0. –

0

Najlepszą rzeczą jest dodanie odniesienia do System.web..dll

i wykorzystania var EncodedUrl = System.Web.HttpUtility.UrlEncode ("URL_TEXT");

można znaleźć plik w System.web.dll

0

Uri.EscapeUriString nie powinny być wykorzystywane do ucieczki ciąg być przekazywane w adresie URL, ponieważ nie kodować wszystkie znaki, jak można się było spodziewać. Znak "+" jest dobrym przykładem, który nie jest uniknięty. To następnie zostanie przekonwertowane na spację w adresie URL, ponieważ oznacza to w prostym URI. Oczywiście powoduje to masowe problemy w chwili, gdy próbujesz przekazać coś w rodzaju 64-kodowego łańcucha w adresie URL, a spacje pojawiają się w całym tekście na końcu odbierającym.

Możesz użyć HttpUtility.UrlEncode i dodać wymagane odniesienia do swojego projektu (a jeśli komunikujesz się z aplikacją internetową, to nie widzę powodu, dla którego nie powinieneś tego robić).

Alternatywnie można użyć Uri.EscapeDataString nad Uri.EscapeUriString jak wyjaśniono bardzo dobrze tutaj: https://stackoverflow.com/a/34189188/7391

Powiązane problemy