2010-12-11 7 views
0

Ich brauche einen Dienst, der einen GET-Parameter namens "names []" verwendet.Verhindern, dass C# aus Klammern in Abfragezeichenfolge codiert wird

Zum Beispiel: GET http://example.com/name2id?names []=john

Wenn ich versuche, dass eine WebClient in C# verbrauchen verwenden, werden die Klammern wird auf% 5B% 5D codiert, das die servies nicht versteht. Wenn ich das obige mit meinem Browser (uncodiert) sende, funktioniert alles gut.

Heres das Beispiel, das nicht funktioniert:

using (var client = new System.Net.WebClient()) 
{ 
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john")); 
} 

von Fiedler Wachte, heres die Anfrage:

GET http://example.com/name2id?names%5B%5D=john HTTP/1.1 
Host: example.com 
Connection: Keep-Alive 

Gibt es eine Möglichkeit der Rahmen nicht die URL kodieren zu machen, oder eine andere Um dieses Problem herum?

P.S. Ich kontrolliere nicht die API, also kann ich das nicht ändern.

UPDATE:

Das ist irgendwie komisch. Ich fand eine Lösung, die Änderung meiner C# -Code:

using (var client = new System.Net.WebClient()) 
{ 
    response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john", true)); 
} 

Notiere die boolean dontEscape in Uri. Es ist eigentlich veraltet, aber es funktioniert? Kann das jemand erklären?

+0

Ich denke, der einzige Weg herum ist, einen WebClient nicht zu verwenden, aber eine manuelle Anfrage mit einem normalen Socket, aber selbst dann wäre es nicht wirklich eine gültige Anfrage, so dass ich Würde mich wundern, wenn der Dienst es akzeptieren würde – Doggett

+0

Sie könnten immer die Bereitstellung bitten, vernünftige Namen in ihren Argumenten zu verwenden und natürlich zu überprüfen, dass sie wirklich "[]" im Namen benötigen. Diese Anforderung erscheint mir ziemlich lächerlich. –

+0

Siehe die aktualisierte. –

Antwort

0

Wie von CodeInChaos erwähnt, ist die URL nicht gemäß RFC2396 gültig.

Um C# nicht entkommen ungültige Zeichen, die überladene Methode von URI zu machen usen sein:

new Uri("http://example.com/name2id?names[]=john", true) 

Allerdings ist diese Methode veraltet ist, aber anscheinend funktioniert es noch. Ich muss leben mit der Warnung auftauchen :)

1

Wie ich verstehe RFC2396 [] sind keine gültigen Zeichen in einem URI. Es sieht also so aus, als ob Ihr Dienst eine misslungene HTTP-Anfrage erwartet.

query   = *uric 
uric   = reserved | unreserved | escaped 
unreserved = alphanum | mark 
mark   = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" 
reserved  = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 
escaped  = "%" hex hex 

http://www.ietf.org/rfc/rfc2396.txt

+0

Das stimmt, aber es ist das, was der Service erwartet, und das kann ich nicht ändern. Es funktioniert über einen Browser, und ich habe tatsächlich eine Lösung gefunden. Ich werde die Frage aktualisieren. –

+0

RFC 3986 (http://tools.ietf.org/html/rfc3986#section-2.2) listet Klammern als reservierte Zeichen auf. "Reserviert" bedeutet jedoch, dass sie nur für eine spezielle Behandlung berechtigt sind *, abhängig von den Serveranforderungen. Dies ist ein großes Problem mit allen aktuellen HTTP-Optionen in .NET in 4.5, da sie alle irgendwann aus dem URI entkommen. – McGuireV10

0

Sind Sie sicher, dass die codierten Zeichen ist das eigentliche Problem?

Die Zeichen werden von der WebClient-Klasse korrekt codiert. Wenn der Dienst keine korrekt codierten Zeichen verarbeiten kann, ist der Dienst unterbrochen.

Wenn der Dienst auf diese Weise unterbrochen ist und Sie ihn trotzdem verwenden müssen, müssen Sie eine andere Möglichkeit finden, die Anfrage zu senden.

0

Sie sollten nur in der Lage sein, passieren sollte die URI als String

so

response = client.DownloadString("http://example.com/name2id?names[]=john"); 

tun arbeiten ohne die URL zu kodieren.

Habe es nicht versucht, also könnte ich falsch liegen.

Verwandte Themen