HttpWebRequest: Wie finde ich eine Postleitzahl bei Canada Post über eine WebRequest mit beigefügtem x-www-Formular?

Momentan schreibe ich einige Tests, um meine Fähigkeiten im Umgang mit dem Internet über Windows Forms zu verbessern. Einer dieser Tests besteht darin, eine Postleitzahl zu finden, die von der Canada Post-Website zurückgesandt werden sollte.

Meine Standard-URL-Einstellung lautet:http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e4s1Die erforderlichen Formularfelder sind:Hausnummer, Straßenname, Stadt, ProvinzDer contentType lautet "application / x-www-form-attached"

BEARBEITEN: Bitte berücksichtigen Sie als contentType den Wert "application / x-www-form-encoded" anstelle von Punkt 3. (Danke EricLaw-MSFT!)

Das Ergebnis, das ich erhalte, ist nicht das erwartete Ergebnis. Ich erhalte den HTML-Quellcode der Seite, auf der ich manuell die Informationen eingeben kann, um die Postleitzahl zu finden, aber nicht den HTML-Quellcode mit der gefundenen Postleitzahl. Hast du eine Ahnung, was ich falsch mache?

Soll ich in Betracht ziehen, den XML-Weg zu gehen? Ist es zunächst möglich, anonym auf Canada Post zu suchen?

Hier ist ein Codebeispiel zur besseren Beschreibung:

public static string FindPostalCode(ICanadadianAddress address) {
   var postData = string.Concat(string.Format("&streetNumber={0}", address.StreetNumber)
    , string.Format("&streetName={0}", address.StreetName)
    , string.Format("&city={0}", address.City)
    , string.Format("&province={0}", address.Province));

   var encoding = new ASCIIEncoding();
   byte[] postDataBytes = encoding.GetBytes(postData);
   request = (HttpWebRequest)WebRequest.Create(DefaultUrlSettings);
   request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Anonymous;
   request.Container = new CookieContainer();
   request.Timeout = 10000;
   request.ContentType = contentType;
   request.ContentLength = postDataBytes.LongLength;
   request.Method = @"post";
   var senderStream = new StreamWriter(request.GetRequestStream());
   senderStream.Write(postDataBytes, 0, postDataBytes.Length);
   senderStream.Close();
   string htmlResponse = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();

   return processedResult(htmlResponse); // Processing the HTML source code parsing, etc.
}

Meiner Meinung nach stecke ich in einem Flaschenhals fest. Ich finde keinen Ausweg zum gewünschten Ergebnis.

BEARBEITEN: Es scheint Parameter wie für den ContentType dieser Site zu geben. Lassen Sie mich erklären.

Es gibt eine mit den "Meta" -Variablen, die folgendes festlegt:

meta http-equiv = "Inhaltstyp" content = "application / xhtml + xml, text / xml, text / html; charset = utf-8"

Und noch einer später im Code, der lautet:

form id = "fpcByAdvancedSearch: fpcSearch" name = "fpcByAdvancedSearch: fpcSearch" method = "post" action = "/ cpotools / apps / fpc / personal / findByCity? execution = e1s1" enctype = "application / x-www-form-urlencoded "

Meine Frage ist folgende: Bei welcher muss ich mich halten?

Lassen Sie mich raten, der erste ContentType ist als der zweite zu betrachten, der nur für eine andere Anfrage an eine Funktion vorgesehen ist oder so, wenn die Daten veröffentlicht werden?

BEARBEITEN: Je näher ich an der Lösung bin, desto mehr Punkte werden auf Anfrage unter dieser Frage aufgelistet:WebRequest: So finden Sie eine Postleitzahl mithilfe einer WebRequest für diesen ContentType = ”application / xhtml + xml, text / xml, text / html; Zeichensatz = utf-8 ”?

Danke für jede Hilfe! :-)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage