C # Owin WebApp: Analyser les demandes POST?

Je voudrais de l’aide pour parsingr les demandes HTTP POST dans une application console C #. L’application utilise un serveur Web avec Owin. Les détails de l’application sont disponibles ici et la «version stable» actuelle du code correspondant est ici .

J’étends l’application ci-dessus pour permettre la configuration via l’interface utilisateur Web. Par exemple, l’application rapporte actuellement un grand nombre de parameters. Je voudrais que l’utilisateur final puisse sélectionner les parameters à signaler sur le réseau. Vers cela, j’ai apporté quelques modifications au code ci-dessus:

using Microsoft.Owin; using Owin; ......... [assembly: OwinStartup(typeof(SensorMonHTTP.WebIntf))] ......... ......... namespace SensorMonHTTP { ... public class WebIntf { public void Configuration(IAppBuilder app) { app.Run(context => { var ConfigPath = new Microsoft.Owin.PathSsortingng("/config"); var ConfigApplyPath = new Microsoft.Owin.PathSsortingng("/apply_config"); var SensorPath = new Microsoft.Owin.PathSsortingng("/"); if (context.Request.Path == SensorPath) { return context.Response.WriteAsync(GetSensorInfo()); /* Returns JSON ssortingng with sensor information */ } else if (context.Request.Path == ConfigPath) { /* Generate HTML dynamically to list out available sensor information with checkboxes using Dynatree: Tree3 under 'Checkbox & Select' along with code to do POST under 'Embed in forms' in http://wwwendt.de/tech/dynatree/doc/samples.html */ /* Final segment of generated HTML is as below:  ..... $("form").submit(function() { var formData = $(this).serializeArray(); var tree = $("#tree3").dynatree("getTree"); formData = formData.concat(tree.serializeArray()); // alert("POST this:\n" + jQuery.param(formData)); // -- This gave the expected ssortingng in an alert when testing out $.post("apply_config", formData); return true ; }); ......   
End of generated HTML code */ } else if (context.Request.Path == ConfigApplyPath) { /* I want to access and parse the POST data here */ /* Tried looking into context.Request.Body as a MemoryStream, but not getting any data in it. */ } } } ........ }

Quelqu’un peut-il m’aider à comprendre comment accéder aux données POST dans la structure de code ci-dessus?

Merci d’avance!

Comme les données sont renvoyées au format KeyValuePair, vous pouvez le convertir en IEnumerable, ce qui ressemble à ceci:

 var formData = await context.Request.ReadFormAsync() as IEnumerable>; 

// maintenant vous avez la liste que vous pouvez interroger

 var formElementValue = formData.FirstOrDefault(x => x.Key == "NameOfYourHtmlFormElement").Value[0]); 

Vous pouvez utiliser l’utilitaire ReadFormAsync () sur l’object IOwinRequest pour lire / parsingr les parameters de formulaire.

 public void Configuration(IAppBuilder app) { app.Run(async context => { //IF your request method is 'POST' you can use ReadFormAsync() over request to read the form //parameters var formData = await context.Request.ReadFormAsync(); //Do the necessary operation here. await context.Response.WriteAsync("Hello"); }); } 

Pour extraire les parameters du corps pour chaque type de contenu, vous pouvez utiliser une méthode comme celle-ci:

  public async static Task> GetBodyParameters(this IOwinRequest request) { var dictionary = new Dictionary(SsortingngComparer.CurrentCultureIgnoreCase); if (request.ContentType != "application/json") { var formCollectionTask = await request.ReadFormAsync(); foreach (var pair in formCollectionTask) { var value = GetJoinedValue(pair.Value); dictionary.Add(pair.Key, value); } } else { using (var stream = new MemoryStream()) { byte[] buffer = new byte[2048]; // read in chunks of 2KB int bytesRead; while ((bytesRead = request.Body.Read(buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, bytesRead); } var result = Encoding.UTF8.GetSsortingng(stream.ToArray()); // TODO: do something with the result var dict = JsonConvert.DeserializeObject>(result); foreach(var pair in dict) { ssortingng value = (pair.Value is ssortingng) ? Convert.ToSsortingng(pair.Value) : JsonConvert.SerializeObject(pair.Value); dictionary.Add(pair.Key, value); } } } return dictionary; } private static ssortingng GetJoinedValue(ssortingng[] value) { if (value != null) return ssortingng.Join(",", value); return null; } 

Références: Moyen le plus efficace de lire les données d’un stream

Context.Request.Body est le bon endroit pour obtenir les valeurs POST, mais vous devez inclure un atsortingbut name sur les éléments de formulaire auxquels vous souhaitez accéder. Sans l’atsortingbut name, tout est ignoré et je n’ai pas été en mesure de trouver un moyen d’accéder à la requête brute, bien que cela puisse être possible – jamais utilisé Owin auparavant.

 if (context.Request.Path == ConfigPath) { SsortingngBuilder sb = new SsortingngBuilder(); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); return context.Response.WriteAsync(sb.ToSsortingng()); } else if (context.Request.Path == ConfigApplyPath) { /* I want to access and parse the POST data here */ /* Tried looking into context.Request.Body as a MemoryStream, but not getting any data in it. */ SsortingngBuilder sb = new SsortingngBuilder(); byte[] buffer = new byte[8000]; int read = 0; read = context.Request.Body.Read(buffer, 0, buffer.Length); while (read > 0) { sb.Append(Encoding.UTF8.GetSsortingng(buffer)); buffer = new byte[8000]; read = context.Request.Body.Read(buffer, 0, buffer.Length); } return context.Response.WriteAsync(sb.ToSsortingng()); } else { return context.Response.WriteAsync(GetSensorInfo()); /* Returns JSON ssortingng with sensor information */ } 

Les travaux suivants, l’astuce consiste à réinitialiser la position du stream.

 context.Request.Body.Position = 0; ssortingng content = new StreamReader(context.Request.Body).ReadToEnd();