WebRequest: Jak znaleźć kod pocztowy za pomocą WebRequest przeciwko temu ContentType = „application / xhtml + xml, text / xml, text / html; charset = utf-8 ”?

Po raz pierwszy opublikowałem to:HttpWebRequest: Jak znaleźć kod pocztowy w Canada Post przez WebRequest z załączonym x-www-form-?.

Podążając za sugestiami AnthonyWJones, zmieniłam kod zgodnie z jego sugestiami.

W związku z kontynuacją mojego dochodzenia zauważyłem z czasem, że typ treści Canada Post jest bardziej prawdopodobny„application / xhtml + xml, text / xml, text / html; charset = utf-8”.

Moje pytania to:

W jaki sposób webrequestujemy na taką stronę typu treści?Czy musimy kontynuować z obiektem NameValueCollection?Według Scotta Lance'a, który hojnie dostarczył mi cennych informacji w ramach mojego poprzedniego pytania, WebRequest zwróci rodzaj informacji niezależnie od rodzaju treści, czy czegoś tu brakuje?Czy muszę zmienić mój kod ze względu na zmianę typu zawartości?

Oto mój kod, aby łatwiej było zrozumieć moje postępy.

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

Ten kod faktycznie zwraca kod źródłowy HTML formularza, który należy wypełnić wymaganymi informacjami, aby przetworzyć go za pomocą wyszukiwania kodu pocztowego. Chciałbym uzyskać kod źródłowy HTML lub cokolwiek to może być ze znalezionym kodem pocztowym.

EDYTOWAĆ: Oto wyjątek WebException, który otrzymuję teraz: „Nie można wysłać treści z tym typem czasownika”. (To jest tłumaczenie z francuskiego wyjątku „Impossible d'envoyer un corps de contenu avec ce type de verbe.”)

Oto mój kod:

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

Linia powodująca wyjątek jest wskazywana przez „=>”. Wygląda na to, że nie mogę użyć GET jako metody, ale to mi kazano zrobić ...

Masz jakiś pomysł, czego tu brakuje? Staram się robić to, co Justin (patrz odpowiedź) zalecił mi zrobić.

Z góry dziękuję za wszelką pomoc! :-)

questionAnswers(1)

yourAnswerToTheQuestion