2014-07-04 13 views
5

Die Eigenschaft UriBuilder.Query "enthält alle im URI enthaltenen Abfragedaten." According to the docs, "die Abfrage-Informationen sind gemäß RFC 2396 maskiert."Warum flieht UriBuilder.query nicht (URL-Codierung) die Abfragezeichenfolge?

Basierend darauf, und da diese Eigenschaft beschreibbar ist, nahm ich an, dass System.UriBuilder Ihre Abfragezeichenfolge und Escape (URL-Codierung) nach RFC 2396 analysieren würde. Insbesondere sind {und} nicht im nicht reservierten Zeichensatz und so they should be escaped according to page 9 of RFC 2396. Aber es scheint, dass System.UriBuilder kein Entkommen tut.

Muss ich manuell Server.URLEncode die Parameter, oder gibt es eine Möglichkeit, System.UriBuilder mit der Codierung umzugehen?

Hier ist mein Beispielcode. Sie können run this on ideone.com and see that, indeed, nothing is URL encoded.

using System; 

public class Test 
{ 
    public static void Main() 
    { 
     var baseUrl = new System.Uri("http://www.bing.com"); 
     var builder = new System.UriBuilder(baseUrl); 
     string name = "param"; 
     string val = "{'blah'}"; 
     builder.Query = name + "=" + val; 

     // Try several different ouput methods; none will be URL encoded 
     Console.WriteLine(builder.ToString()); 
     Console.WriteLine(builder.Uri.ToString()); 
     Console.WriteLine(builder.Query); 
    } 
} 
+0

Ich kann keinen offensichtlichen Code sehen, der irgendeine Art von Konvertierung ausführen würde. Ich frage mich, ob die Dokumentation ist unglaublich schlecht formuliert und sollte sagen, dass der Wert sollte gemäß RFC2396 entkommen. –

+0

Ja, wenn die Dokumente sagen, dass die Abfrage maskiert ist, bedeutet dies, dass die Query-Eigenschaft eines Uri-Objekts beim Lesen maskierte Daten enthält. Wenn Sie diese Daten selbst festlegen, müssen Sie zunächst maskierte Daten angeben. Wenn es Daten für Sie entkam, würde dies zu einem extrem fehleranfälligen '+ =' Workflow führen. – Cameron

+0

@Damien_The_Unbeliever, hatte ich gefragt, ob vielleicht in der Dokumentation „Abfrageinformationen entkommen“ sollte „Abfrage Informationen sollten entkommen werden“, oder noch deutlicher zu sein „sollten Sie Abfrageinformationen entkommen, bevor es auf diese Eigenschaft zu schreiben.“ – Josh

Antwort

10
builder.Uri.AbsoluteUri 

ist die Droiden Sie suchen, die in Ihrem Fall, ob die &, + oder = Symbol

http://www.bing.com/?param=%7B'blah'%7D

Angesichts der Schwierigkeiten mit dem Wissen

kehrt codiert werden sollte oder nicht, es ist wahrscheinlich besser, wenn Sie die Eigenschaft .Query zuweisen.

+0

Ich habe versucht, AbsoluteUri und es scheint die gleiche uncodierte Ausgabe zu geben ... Siehe diesen ideone.com Test: http://ideone.com/Xl7qfp – Josh

+0

@Josh: Wenn Sie es in einer Konsolen-App tun, ist es richtig entkommen. IDEone macht etwas unkonventionelles zur Konsolenausgabe. – spender

+0

Während diese Antwort nicht meine konkrete Frage („Warum UriBuilder die' Query' Eigenschaft nicht zu entkommen?“), Ist es mir nicht geben Sie die Antwort, die ich wirklich suchte. Vielen Dank! Nur der Vollständigkeit halber habe ich eine Antwort hinzugefügt, die direkt die genaue Frage beantwortet, die ich gestellt habe. – Josh

1

In der Praxis habe ich festgestellt, dass Sie manuell Ihre Abfrageparameter selbst entkommen müssen. System.Uri.AbsoluteUri wird versuchen, Dinge für Sie zu entkommen (wie in spender's answer erwähnt), aber es kann nicht gelingen. Bei einem Wert von [email protected] belässt AbsoluteUri das + unescaped, wenn es als %2B maskiert werden soll. Andernfalls, wenn die Abfragezeichenfolge decodiert wird, wird das + in ein Leerzeichen umgewandelt, wobei someemail [email protected] als der endgültige decodierte Wert übrig bleibt.

Die Quintessenz ist, müssen Sie es selbst entkommen, um sicherzustellen, dass es korrekt maskiert ist.

Nach der Überprüfung des Codes in UriBuilder.Query get/set Code mit dotPeek, muss ich feststellen, dass die Dokumente einfach schlecht geschrieben sind. Anstelle von "die Abfrage Informationen ist entkam nach RFC 2396," sollte es sagen, "die Abfrage Informationen sollte gemieden nach RFC 2396 sein."

Wie Sie aus der dotPeek Dekompilierung System.UriBuilder.Query unten sehen können, gibt es keine automatische Flucht in der Abfrage Getter oder Setter geschieht.

[__DynamicallyInvokable] 
public string Query 
{ 
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get 
    { 
    return this.m_query; 
    } 
    [__DynamicallyInvokable] set 
    { 
    if (value == null) 
     value = string.Empty; 
    if (value.Length > 0) 
     value = (string) (object) '?' + (object) value; 
    this.m_query = value; 
    this.m_changed = true; 
    } 
} 

System.Uri.AbsoluteUri jedoch macht einen Versuch, die Dinge zu entkommen. Beachten Sie den Aufruf von get.GetParts im Getter:

[__DynamicallyInvokable] 
public string Authority 
{ 
    [__DynamicallyInvokable] get 
    { 
    if (this.IsNotAbsoluteUri) 
     throw new InvalidOperationException(System.SR.GetString("net_uri_NotAbsolute")); 
    else 
     return this.GetParts(UriComponents.Host | UriComponents.Port, UriFormat.UriEscaped); 
    } 
} 
+0

Yep UrlBuilder ist ein bisschen Mangel ... Sie können jetzt die [Quelle] (https sehen : //github.com/dotnet/corefx/blob/c02d33b18398199f6acc17d375dab154e9a1df66/src/System.Private.Uri/src/System/UriBuilder.cs#L265) und hier ist ein Fehler mit + = [hier] (https: // github .com/dotnet/corefx/ausgaben/3646) – KCD

Verwandte Themen