Publicar datos de formulario usando HttpWebRequest

Deseo publicar algunos datos de formulario en una URL específica que no está dentro de mi propia aplicación web. Tiene el mismo dominio, como “domain.client.nl”. La aplicación web tiene una url “web.domain.client.nl” en la url donde quiero publicar es “idp.domain.client.nl”. Pero mi código no hace nada … ¿alguien sabe lo que estoy haciendo mal?

Wouter

StringBuilder postData = new StringBuilder(); postData.Append(HttpUtility.UrlEncode(String.Format("username={0}&", uname))); postData.Append(HttpUtility.UrlEncode(String.Format("password={0}&", pword))); postData.Append(HttpUtility.UrlEncode(String.Format("url_success={0}&", urlSuccess))); postData.Append(HttpUtility.UrlEncode(String.Format("url_failed={0}", urlFailed))); ASCIIEncoding ascii = new ASCIIEncoding(); byte[] postBytes = ascii.GetBytes(postData.ToString()); // 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(); 

Tanto el nombre del campo como el valor deben estar codificados en url. el formato de los datos de la publicación y la cadena de consulta son los mismos

La forma de hacer de .net es algo como esto

 NameValueCollection outgoingQueryString = HttpUtility.ParseQueryString(String.Empty); outgoingQueryString.Add("field1","value1"); outgoingQueryString.Add("field2", "value2"); string postdata = outgoingQueryString.ToString(); 

Esto se encargará de codificar los campos y los nombres de los valores

Prueba esto:

 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 responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

Está codificando el formulario incorrectamente. Solo debe codificar los valores:

 StringBuilder postData = new StringBuilder(); 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)); 

editar

Estaba equivocado De acuerdo con RFC1866 sección 8.2.1, tanto los nombres como los valores deben estar codificados.

Pero para el ejemplo dado, los nombres no tienen ningún carácter que deba codificarse, por lo que en este caso mi ejemplo de código es correcto;)

El código en la pregunta sigue siendo incorrecto ya que codificaría el signo igual, que es la razón por la cual el servidor web no puede decodificarlo.

Una manera más apropiada habría sido:

 StringBuilder postData = new StringBuilder(); 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 StringBuilder sb, string name, string value) { if (sb.Length != 0) sb.Append("&"); sb.Append(HttpUtility.UrlEncode(name)); sb.Append("="); sb.Append(HttpUtility.UrlEncode(value)); }