WebRequest: So finden Sie eine Postleitzahl mithilfe einer WebRequest für diesen ContentType = “application / xhtml + xml, text / xml, text / html; Zeichensatz = utf-8 ”?
Ich habe das zum ersten Mal gepostet:HttpWebRequest: Wie finde ich eine Postleitzahl bei Canada Post über eine WebRequest mit beigefügtem x-www-Formular?.
Aufgrund von AnthonyWJones Vorschlägen habe ich meinen Code entsprechend seinen Vorschlägen geändert.
Auf eine Fortsetzung meiner Anfrage habe ich mit der Zeit bemerkt, dass der Inhaltstyp der Canada Post wahrscheinlicher ist"application / xhtml + xml, text / xml, text / html; charset = utf-8".
Meine Fragen sind:
Wie stellen wir eine Webanforderung für eine solche inhaltliche Website?Müssen wir mit dem NameValueCollection-Objekt weitermachen?Laut Scott Lance, der mir im Rahmen meiner vorhergehenden Frage großzügig wertvolle Informationen zur Verfügung gestellt hat, wird die WebRequest die Art der Informationen unabhängig von der Art des Inhalts zurückgeben. Vermisse ich hier etwas?Muss ich meinen Code wegen der Änderung des Inhaltstyps ändern?Hier ist mein Code, damit ich meinen Fortschritt besser nachvollziehen kann.
internal class PostalServicesFactory {
/// <summary>
/// Initializes an instance of GI.BusinessSolutions.Services.PostalServices.Types.PostalServicesFactory class.
/// </summary>
internal PostalServicesFactory() {
}
/// <summary>
/// Finds a Canadian postal code for the provided Canadian address.
/// </summary>
/// <param name="address">The instance of GI.BusinessSolutions.Services.PostalServices.ICanadianCityAddress for which to find the postal code.</param>
/// <returns>The postal code found, otherwise null.</returns>
internal string FindPostalCode(ICanadianCityAddress address) {
if (address == null)
throw new InvalidOperationException("No valid address specified.");
using (ServicesWebClient swc = new ServicesWebClient()) {
var values = new System.Collections.Specialized.NameValueCollection();
values.Add("streetNumber", address.StreetNumber.ToString());
values.Add("numberSuffix", address.NumberSuffix);
values.Add("suite", address.Suite);
values.Add("streetName", address.StreetName);
values.Add("streetDirection", address.StreetDirection);
values.Add("city", address.City);
values.Add("province", address.Province);
byte[] resultData = swc.UploadValues(@"http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity", "POST", values);
return Encoding.UTF8.GetString(resultData);
}
}
private class ServicesWebClient : WebClient {
public ServicesWebClient()
: base() {
}
protected override WebRequest GetWebRequest(Uri address) {
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = new CookieContainer();
return request;
}
}
}
Dieser Code gibt tatsächlich den HTML-Quellcode des Formulars zurück, das mit den erforderlichen Informationen gefüllt werden muss, um die Postleitzahlensuche durchzuführen. Ich wünsche mir den HTML-Quellcode oder was auch immer er mit der gefundenen Postleitzahl sein mag.
BEARBEITEN: Hier ist die WebException, die ich jetzt erhalte: "Inhaltstext mit dieser Art von Verb kann nicht gesendet werden." (Dies ist eine Übersetzung aus der französischen Ausnahme "Impossible d'envoyer un corps de contenu avecce type de verbe".)
Hier ist mein Code:
internal string FindPostalCode(string url, ICanadianAddress address) {
string htmlResult = null;
using (var swc = new ServiceWebClient()) {
var values = new System.Collections.Specialized.NameValueCollection();
values.Add("streetNumber", address.StreetNumber.ToString());
values.Add("numberSuffix", address.NumberSuffix);
values.Add("suite", address.Suite);
values.Add("streetName", address.StreetName);
values.Add("streetDirection", address.StreetDirection);
values.Add("city", address.City);
values.Add("province", address.Province);
swc.UploadValues(url, @"POST", values);
string redirectUrl = swc.ResponseHeaders.GetValues(@"Location")[0];
=> swc.UploadValues(redirectUrl, @"GET", values);
}
return htmlResult;
}
Die Zeile, die die Ausnahme verursacht, ist mit "=>" gekennzeichnet. Es scheint, dass ich GET nicht als Methode verwenden kann, aber es wurde mir gesagt, dass ich das tun soll ...
Irgendeine Idee, was ich hier vermisse? Ich versuche das zu tun, was Justin (siehe Antwort) mir empfohlen hat.
Vielen Dank im Voraus für jede Hilfe! :-)