Publier les données du formulaire à l’aide de HttpWebRequest

Je souhaite publier des données de formulaire sur une URL spécifiée qui ne se trouve pas dans ma propre application Web. Il a le même domaine, comme “domain.client.nl”. L’application web a une url “web.domain.client.nl” et l’URL où je veux l’envoyer est “idp.domain.client.nl”. Mais mon code ne fait rien ….. quelqu’un sait-il ce que je fais mal?

Wouter

SsortingngBuilder postData = new SsortingngBuilder(); postData.Append(HttpUtility.UrlEncode(Ssortingng.Format("username={0}&", uname))); postData.Append(HttpUtility.UrlEncode(Ssortingng.Format("password={0}&", pword))); postData.Append(HttpUtility.UrlEncode(Ssortingng.Format("url_success={0}&", urlSuccess))); postData.Append(HttpUtility.UrlEncode(Ssortingng.Format("url_failed={0}", urlFailed))); ASCIIEncoding ascii = new ASCIIEncoding(); byte[] postBytes = ascii.GetBytes(postData.ToSsortingng()); // set up request object HttpWebRequest request; try { request = (HttpWebRequest)HttpWebRequest.Create(WebSiteConstants.UrlIdp); } catch (UriFormatException) { request = null; } if (request == null) throw new ApplicationException("Invalid URL: " + WebSiteConstants.UrlIdp); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postBytes.Length; request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; // add post data to request Stream postStream = request.GetRequestStream(); postStream.Write(postBytes, 0, postBytes.Length); postStream.Flush(); postStream.Close(); 

Le nom du champ et la valeur doivent tous deux être encodés en URL. le format des données de poste et de la chaîne de requête est le même

La manière de faire .net est quelque chose comme ça

 NameValueCollection outgoingQuerySsortingng = HttpUtility.ParseQuerySsortingng(Ssortingng.Empty); outgoingQuerySsortingng.Add("field1","value1"); outgoingQuerySsortingng.Add("field2", "value2"); ssortingng postdata = outgoingQuerySsortingng.ToSsortingng(); 

Cela se chargera d’encoder les champs et les noms de valeur

Essaye ça:

 var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); var postData = "thing1=hello"; postData += "&thing2=world"; var data = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseSsortingng = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

Vous encodez le formulaire de manière incorrecte. Vous ne devez encoder que les valeurs:

 SsortingngBuilder postData = new SsortingngBuilder(); postData.Append("username=" + HttpUtility.UrlEncode(uname) + "&"); postData.Append("password=" + HttpUtility.UrlEncode(pword) + "&"); postData.Append("url_success=" + HttpUtility.UrlEncode(urlSuccess) + "&"); postData.Append("url_failed=" + HttpUtility.UrlEncode(urlFailed)); 

modifier

J’étais incorrect Conformément à la section 8.2.1 de la RFC1866, les noms et les valeurs doivent être codés.

Mais pour l’exemple donné, les noms n’ont aucun caractère à encoder, donc dans ce cas mon exemple de code est correct;)

Le code dans la question est toujours incorrect car il coderait le signe égal qui est la raison pour laquelle le serveur Web ne peut pas le décoder.

Une manière plus appropriée aurait été:

 SsortingngBuilder postData = new SsortingngBuilder(); postData.AppendUrlEncoded("username", uname); postData.AppendUrlEncoded("password", pword); postData.AppendUrlEncoded("url_success", urlSuccess); postData.AppendUrlEncoded("url_failed", urlFailed); //in an extension class public static void AppendUrlEncoded(this SsortingngBuilder sb, ssortingng name, ssortingng value) { if (sb.Length != 0) sb.Append("&"); sb.Append(HttpUtility.UrlEncode(name)); sb.Append("="); sb.Append(HttpUtility.UrlEncode(value)); }