2009-11-20 3 views
12

J'utilise HttpListener pour fournir un serveur web à une application écrite dans une autre technologie sur localhost. L'application utilise une simple soumission de formulaire (application/x-www-form-urlencoded) pour faire ses demandes à mon logiciel. Je veux savoir s'il existe déjà un analyseur écrit pour convertir le corps du document de requête html en une table de hachage ou équivalent.Existe-t-il une méthode prête à l'emploi .NET pour traiter le corps de réponse d'un corps HttpListenerRequest de HttpListener?

J'ai du mal à croire que j'ai besoin de l'écrire moi-même, étant donné que .NET semble déjà fournir.

Merci à l'avance,

Répondre

21

Vous voulez dire quelque chose comme HttpUtility.ParseQueryString qui vous donne un NameValueCollection? Voici un exemple de code. Vous avez besoin de plus de vérification des erreurs et peut-être utiliser le type de contenu à la demande de comprendre l'encodage:

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

Si vous utilisez HTTP GET au lieu de POST:

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

Jotham utilise 'HTTP-GET' et non' HTTP-POST'. N'est-ce pas? –

+0

L'échantillon que j'ai posté est en fait pour POST. Si vous voulez GET .../moi ajoute cela à l'exemple de code. – Gonzalo

+0

Cela ne répond toujours pas à ce qu'il demande: un analyseur x-www-form-urlencoded, pas un analyseur de chaîne de requête. – nitzmahone

0

Les bits magiques qui remplissent HttpRequest .Form sont dans System.Web.HttpRequest, mais ils ne sont pas publics (Reflector la méthode "FillInFormCollection" sur cette classe à voir). Vous devez intégrer votre pipeline avec HttpRuntime (écrire essentiellement un hôte ASP.NET simple) pour tirer pleinement parti.

0

Si vous voulez éviter la dépendance System.Web qui est nécessaire pour utiliser HttpUtility.ParseQueryString, vous pouvez utiliser la méthode d'extension UriParseQueryString trouvé dans System.Net.Http.

Veillez à ajouter une référence (si vous ne l'avez pas déjà fait) à System.Net.Http dans votre projet.

Notez que vous devez convertir le corps de la réponse en Uri valide pour que ParseQueryString (dans System.Net.Http) fonctionne.

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(); 
Questions connexes