Comment publier des données sur le contrôleur MVC à l’aide de HttpWebRequest?

J’essaie de poster des données sur l’action du contrôleur MVC mais je n’ai pas réussi jusqu’à présent.

Voici la structure des données de poste:

private ssortingng makeHttpPostSsortingng(XmlDocument interchangeFile) { ssortingng postDataSsortingng = "uid={0}&localization={1}&label={2}&interchangeDocument={3}"; InterchangeDocument interchangeDocument = new InterchangeDocument(interchangeFile); using (var ssortingngWriter = new SsortingngWriter()) using (var xmlTextWriter = XmlWriter.Create(ssortingngWriter)) { interchangeFile.WriteTo(xmlTextWriter); ssortingng interchangeXml = HttpUtility.UrlEncode(ssortingngWriter.GetSsortingngBuilder().ToSsortingng()); ssortingng hwid = interchangeDocument.DocumentKey.Hwid; ssortingng localization = interchangeDocument.DocumentKey.Localization.ToSsortingng(); ssortingng label = ConfigurationManager.AppSettings["PreviewLabel"]; return (ssortingng.Format(postDataSsortingng, hwid, localization, label, interchangeXml)); } } 

Voici la demande:

  HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(controllerUrl); webRequest.Method = "POST"; // webRequest.ContentType = "application/x-www-form-urlencoded"; ssortingng postData = makeHttpPostSsortingng(interchangeFile); byte[] byteArray = Encoding.UTF8.GetBytes(postData); webRequest.ContentLength = byteArray.Length; using (Stream dataStream = webRequest.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } HttpWebResponse webresponse = (HttpWebResponse) webRequest.GetResponse(); 

Lorsque je règle le type de contenu de la demande sur “application / x-www-form-urlencoded”, GetReponse () échoue avec le code d’erreur de serveur 500. Lorsque je commente cette sortie et que httpencode les données xml, “interchangeXml”, la publication est envoyée mais seul le 3ème paramètre “label” parvient au contrôleur. Les autres sont nuls.

Quelle est la bonne façon de publier des valeurs dans une action du contrôleur lorsque l’une de ces valeurs est une donnée XML?

Merci!

Mettre à jour

Je suis envoyer tous les parameters à l’exception du XML via la chaîne de requête. Cependant, le problème est que je ne sais pas comment accéder aux données publiées dans l’action du contrôleur. Quelqu’un peut-il me dire comment j’accède au XML à partir de HttpRequest à partir de mon action de contrôleur?

Mettre à jour

J’ai refactoré le code ci-dessus pour utiliser les suggestions proposées par Darin. Je reçois une erreur de serveur interne (500) à l’aide de WebClient UploadValues ​​().

Action:

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult BuildPreview(PreviewViewModel model) { ... } 

Demande:

 private ssortingng PostToSxController(XmlDocument interchangeFile, ssortingng controllerUrl) { var xmlInterchange = new InterchangeDocument(interchangeFile); using (var client = new WebClient()) { var values = new NameValueCollection() { {"uid", xmlInterchange.DocumentKey.Hwid}, {"localization", xmlInterchange.DocumentKey.Localization.ToSsortingng()}, {"label", ConfigurationManager.AppSettings["PreviewLabel"]}, {"interchangeDocument", interchangeFile.OuterXml } }; byte[] result = null; try { result = client.UploadValues(controllerUrl, values); } catch(WebException ex) { var errorResponse = ex.Response; var errorMessage = ex.Message; } Encoding encoding = Encoding.UTF8; return encoding.GetSsortingng(result); } } 

Route:

 routes.MapRoute( "BuildPreview", "SymptomTopics/BuildPreview/{model}", new { controller = "SymptomTopics", action = "BuildPreview", model = UrlParameter.Optional } ); 

Trop compliqué et non sécurisé votre code client avec toutes ces demandes et réponses. Vous n’encodez aucun de vos parameters de requête, sans parler de ce XML qui va probablement tout casser si vous ne l’encodez pas correctement.

Pour cette raison, je voudrais simplifier et laisser le code de plomberie relatif au codage, etc., dans le framework .NET:

 using (var client = new WebClient()) { var values = new NameValueCollection { { "uid", hwid }, { "localization", localization }, { "label", label }, { "interchangeDocument", interchangeFile.OuterXml }, }; var result = client.UploadValues(controllerUrl, values); // TODO: do something with the results returned by the controller action } 

En ce qui concerne le côté serveur, chaque application ASP.NET MVC correctement architecturée utiliserait évidemment un modèle de vue:

 public class MyViewModel { public ssortingng Uid { get; set; } public ssortingng Localization { get; set; } public ssortingng Label { get; set; } public ssortingng InterchangeDocument { get; set; } } 

avec:

 [HttpPost] public ActionResult Foo(MyViewModel model) { // TODO: do something with the values here ... } 

Évidemment, cela pourrait aller plus loin en écrivant un modèle de vue reflétant la structure de votre document XML:

 public class Foo { public ssortingng Bar { get; set; } public ssortingng Baz { get; set; } } 

et ensuite votre modèle de vue deviendra:

 public class MyViewModel { public ssortingng Uid { get; set; } public ssortingng Localization { get; set; } public ssortingng Label { get; set; } public Foo InterchangeDocument { get; set; } } 

et la dernière partie consisterait à écrire un classeur de modèle personnalisé pour le type Foo qui utilisera un sérialiseur XML (ou autre) pour désérialiser la valeur InterchangeDocument POSTed dans une instance Foo . Maintenant c’est une affaire sérieuse.

Je suis en train de lutter contre la même bête: essayer de configurer une action de contrôleur en tant que sharepoint terminaison XML

L’erreur interne du serveur est peut-être due à la validation de la page (solution: addotate with ValidateInput (false)) ou à l’envoi d’un en-tête Accept-Encoding avec votre demande. J’aimerais beaucoup savoir comment je peux faire en sorte que MVC accepte les entrées postées sans l’en-tête HTTP Accept-Encoding HTTP …

Je viens de découvrir que vous pouvez appeler un contrôleur, même une dépendance injectée, même à partir d’un code Web Forms en utilisant le package Nuget “T4MVC”:

https://github.com/T4MVC/T4MVC