Frage Post Formulardaten mit HttpWebRequest


Ich möchte einige Formulardaten an eine angegebene URL senden, die nicht in meiner eigenen Webanwendung enthalten ist. Es hat die gleiche Domain, wie "domain.client.nl". Die Webanwendung hat eine URL "web.domain.client.nl" in der URL wo ich posten möchte ist "idp.domain.client.nl". Aber mein Code tut nichts ... weiß jemand, was ich falsch mache?

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

75
2018-02-05 08:18


Ursprung


Antworten:


Sowohl der Feldname als auch der Wert sollten URL-codiert sein. Das Format der Postdaten und der Abfragezeichenfolge ist identisch

Das .net-Verfahren ist so etwas

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

Dies wird für die Codierung der Felder und der Wertnamen sorgen


66
2018-03-06 19:48



Sie codieren das Formular falsch. Sie sollten nur die Werte codieren:

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));

bearbeiten 

Ich war falsch. Gemäß RFC1866 Abschnitt 8.2.1 Beide Namen und Werte sollten codiert sein.

Aber für das gegebene Beispiel haben die Namen keine Zeichen, die codiert werden müssen, in diesem Fall ist mein Codebeispiel korrekt;)

Der Code in der Frage ist immer noch falsch, da er das Gleichheitszeichen codiert, weshalb der Webserver den Code nicht dekodieren kann.

Ein richtiger Weg wäre gewesen:

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));
}

36
2018-02-05 08:27



Versuche dies:

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

36
2018-04-14 03:55