Vollständige Abfragezeichenfolge in C # ASP.NET abrufen

79

Als PHP-Programmierer bin ich es gewohnt, $ _GET zum Abrufen der HTTP-Abfragezeichenfolge zu verwenden ... und wenn ich die gesamte Zeichenfolge benötige, gibt es viele Möglichkeiten, dies zu tun.

In ASP kann ich die Abfrage jedoch nicht erhalten.

Hier ist der Code für news.aspx (eingebettet in HTML):

<%                             
    string URL = "http://www.example.com/rendernews.php?"+Request.Querystring;
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Ich rufe die Ausgabe eines PHP-Skripts von einem Remote-Server ab, und dies funktioniert perfekt ohne den Request.Querystring.

Das Problem ist, dass ich versuche, die vollständige Abfragezeichenfolge in der ersten Zeile abzurufen: Request.Querystring. Ich erhalte die Fehlermeldung " Objektreferenz nicht auf eine Instanz eines Objekts festgelegt ", was im Grunde bedeutet, dass Request.Querystring nicht vorhanden ist.

Irgendeine Idee, wo das Problem liegt? Wie kann ich diese Abfragezeichenfolge erhalten, wenn index.aspx wie http://test.com/news.aspx?id=2 aufgerufen wird, ruft mein Skript http://www.example.com/rendernews.php?id=2 ab

Antony Carthy
quelle
Schlägt es immer fehl oder gibt es Randfälle, in denen keine get-Variablen definiert sind?
Matt

Antworten:

16

Dies sollte für Sie gut funktionieren.

Schreiben Sie diesen Code für den Page_LoadFall der Seite.

string ID = Request.QueryString["id"].ToString();
Response.Redirect("http://www.example.com/rendernews.php?id=" + ID);
Naveed Butt
quelle
8

Request.QueryStringGibt Ihnen eine Sammlung von Schlüssel / Wert-Paaren zurück, die die Abfragezeichenfolge darstellen. Kein String. Denken Sie jedoch nicht, dass dies einen Objektreferenzfehler verursachen würde. Der Grund, warum Sie das bekommen, ist, wie Mauro in den Kommentaren betonte. Es ist QueryString und nicht Querystring.

Versuchen:

Request.QueryString.ToString();

oder

<%                                 
    string URL = Request.Url.AbsoluteUri 
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Entspricht Ihrem Code, Request.Url.AbsoluteUrigibt jedoch den vollständigen Pfad einschließlich der Abfragezeichenfolge zurück.

Damien
quelle
Damit erhalte ich: "'System.Web.HttpRequest' enthält keine Definition für 'Querystring' und keine Erweiterungsmethode 'Querystring', die ein erstes Argument vom Typ 'System.Web.HttpRequest' akzeptiert" und wenn ich versuche, System hinzuzufügen. Web davor erhalte ich "Der Typ- oder Namespace-Name 'Request' existiert nicht im Namespace 'System.Web' (fehlt Ihnen eine Assembly?)"
Antony Carthy
Vielleicht möchten Sie sicherstellen, dass Sie die Anforderung nicht irgendwo überschreiben. Ich habe etwas mit Request.Querystring [.ToString ()] in der Produktion und es funktioniert einwandfrei.
Matt
2
ist es nicht QueryString und nicht Querystring? Code oben sieht aus wie c # - Groß- und Kleinschreibung
Mauro
1
In meinem Fall ist dies genau das, was ich vermeiden möchte, da ToString () in der **** alten Version des .NET Frameworks, die ich verwenden muss, fehlerhaft ist.
Florian Winter
1

Verwenden Sie einfach Request.QueryString.ToString(), um die vollständige Abfragezeichenfolge wie folgt abzurufen:

string URL = "http://www.example.com/rendernews.php?"+Request.Querystring.ToString();
terR0Q
quelle
1
Dies gibt den Namen der Klasse zurück.
Allov
1
@Allov Ich habe das getestet und es hat die Abfragezeichenfolge korrekt zurückgegeben, und tatsächlich funktioniert es auch ohne .ToString (), wenn es mit einer Zeichenfolge verkettet wird
yoel halb
In .Net 4 hat es nicht funktioniert. Möglicherweise sind die Stimmen für andere Versionen von .Net.
Fabio Milheiro
1
Es ändert sich tatsächlich & für & amp; so macht es es unbrauchbar. Request.Url.Query ist viel besser.
Jiří Herník
0

Ich habe Ihr Beispiel getestet, und während Request.QueryString weder implizit noch explizit in eine Zeichenfolge konvertierbar ist, gibt die Methode .ToString () das richtige Ergebnis zurück.

Wenn Sie wie in Ihrem Beispiel mit dem Operator "+" mit einer Zeichenfolge verketten, wird außerdem das richtige Ergebnis zurückgegeben (da sich dies so verhält, als ob .ToString () aufgerufen wurde).

Als solches ist nichts falsch an Ihrem Code, und ich würde vorschlagen, dass Ihr Problem auf einen Tippfehler in Ihrem Code zurückzuführen ist, der "Querystring" anstelle von "QueryString" schreibt.

Dies ist bei Ihrer Fehlermeldung sinnvoller, da QueryString eine weitere Fehlermeldung geben muss, wenn das Problem darin besteht, dass QueryString eine Sammlung und keine Zeichenfolge ist.

yoel halb
quelle
-1

Vor einem Moment bin ich auf das gleiche Problem gestoßen. und ich löse es auf folgende Weise.

Response.Redirect("../index.aspx?Name="+this.textName.Text+"&LastName="+this.textlName.Text);

in Bezug auf das dies

user2147280
quelle
1
Erstellen Sie niemals niemals solche URLs in einem Framework oder einer Programmiersprache. Verwenden Sie URL-Builder. Sie kümmern sich um die Codierung für Sie, was der obige Code nicht tut.
Florian Winter