2009-11-20 4 views
12

Ich verwende HttpListener, um einen Webserver für eine Anwendung bereitzustellen, die in einer anderen Technologie auf localhost geschrieben wurde. Die Anwendung verwendet eine einfache Formularübertragung (application/x-www-form-urlencoded), um Anfragen an meine Software zu stellen. Ich möchte wissen, ob bereits ein Parser geschrieben wurde, um den Hauptteil des HTML-Request-Dokuments in eine Hash-Tabelle oder ein Äquivalent zu konvertieren.Gibt es eine fertige .NET-Methode zum Verarbeiten des Antworthauptteils eines HttpListener-HttpListenerRequest-Hauptteils?

Ich finde es schwer zu glauben, dass ich das selbst schreiben muss, angesichts der Tatsache, wie viel .NET bereits zu bieten scheint.

Vielen Dank im Voraus,

Antwort

21

Sie so etwas wie HttpUtility.ParseQueryString bedeuten, dass Sie eine Namevaluecollection gibt? Hier ist ein Beispielcode. Sie brauchen mehr Fehlerprüfung und möglicherweise die Anforderung Inhaltstyp verwenden, um die Codierung herauszufinden:

string input = null; 
using (StreamReader reader = new StreamReader (listenerRequest.InputStream)) { 
    input = reader.ReadToEnd(); 
} 
NameValueCollection coll = HttpUtility.ParseQueryString (input); 

Wenn Sie HTTP verwenden anstelle von POST GET:

string input = listenerRequest.Url.QueryString; 
NameValueCollection coll = HttpUtility.ParseQueryString (input); 
+0

Das ist vorgesehen Jotham verwendet 'HTTP-GET' und nicht' HTTP-POST'. Ist es nicht? –

+0

Die Probe, die ich gepostet habe, ist eigentlich für POST. Wenn du GET ... willst,/me fügt das dem Beispielcode hinzu. – Gonzalo

+0

Dies richtet sich immer noch nicht auf das, wonach er fragt: einen x-www-form-urlencodierten Parser, keinen Abfrage-String-Parser. – nitzmahone

0

Die magischen Bits, die Httprequest ausfüllen .Form ist in System.Web.HttpRequest, aber sie sind nicht öffentlich (Reflector die Methode "FillInFormCollection" für diese Klasse zu sehen). Sie müssen Ihre Pipeline mit HttpRuntime integrieren (im Grunde einen einfachen ASP.NET-Host schreiben), um alle Vorteile zu nutzen.

0

Wenn Sie die Abhängigkeit von System.Web vermeiden wollen, dass HttpUtility.ParseQueryString verwenden erforderlich ist, können Sie die Uri Erweiterungsmethode ParseQueryString in System.Net.Http gefunden verwenden.

Stellen Sie sicher, dass Sie in Ihrem Projekt eine Referenz (falls noch nicht vorhanden) zu System.Net.Http hinzufügen.

Beachten Sie, dass Sie den Antworttext in einen gültigen Uri konvertieren müssen, damit ParseQueryString (in System.Net.Http) funktioniert.

string body = "value1=randomvalue1&value2=randomValue2"; 

// "http://localhost/query?" is added to the string "body" in order to create a valid Uri. 
string urlBody = "http://localhost/query?" + body; 
NameValueCollection coll = new Uri(urlBody).ParseQueryString(); 
Verwandte Themen